“玲瓏杯”ACM比賽 Round #18 A 計算幾何你瞎暴力(瞎暴力)
阿新 • • 發佈:2017-07-17
base i++ xmlns element thml tex math 可能 ive
題目鏈接:http://www.ifrog.cc/acm/problem/1143
題意:如果從一個坐標為 (x1,y1,z1)(x1,y1,z1)的教室走到(x2,y2,z2)(x2,y2,z2)的距離為 |x1−x2|+|y1−y2|+|z1−z2|
那麽有多少對教室之間的距離是不超過R的呢?
題解:暴力暴力,把點記錄在三維數組裏面,然後暴力搜尋符合條件的點,值得註意的是在同個位置可能有不同的教室(明顯不符合現實,蜜汁尷尬(逃.....)
不同位置直接暴力,會重復計算一次,比如點(1,2,3)和點(4,5,6)反過來會多計算一次,把相同位置的教室計算值也擴大一倍,最後一起除以2。
數據有點大,用int會爆,要用long long 。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 typedef long long LL; 7 LL map[11][11][11]; 8 LL ans[33]; 9 10 int main(){ 11 LL t; 12 cin>>t; 13 while(t--){ 14memset(map,0,sizeof(map)); 15 memset(ans,0,sizeof(ans)); 16 17 LL x,y,z,n,q,R; 18 cin>>n>>q; 19 20 for(int i=1;i<=n;i++){ 21 cin>>x>>y>>z; 22 map[x][y][z]++; 23 } 24 2526 for(int i=0;i<=10;i++) 27 for(int j=0;j<=10;j++) 28 for(int k=0;k<=10;k++) 29 for(int a=0;a<=10;a++) 30 for(int b=0;b<=10;b++) 31 for(int c=0;c<=10;c++){ 32 if(map[i][j][k]&&map[a][b][c]){ 33 if(i==a&&j==b&&k==c){ 34 LL t1=map[i][j][k]; 35 ans[0]+=(t1-1)*t1; 36 } 37 else{ 38 LL t2=abs(i-a)+abs(j-b)+abs(k-c); 39 ans[t2]+=map[i][j][k]*map[a][b][c]; 40 } 41 } 42 } 43 44 for(int i=0;i<=30;i++) ans[i]/=2; 45 for(int i=1;i<=30;i++) ans[i]+=ans[i-1]; 46 47 for(int i=1;i<=q;i++){ 48 cin>>R; 49 if(R>30) R=30; 50 cout<<ans[R]<<endl; 51 } 52 53 } 54 return 0; 55 }
“玲瓏杯”ACM比賽 Round #18 A 計算幾何你瞎暴力(瞎暴力)