1. 程式人生 > >“玲瓏杯”ACM比賽 Round #18 A 計算幾何你瞎暴力(瞎暴力)

“玲瓏杯”ACM比賽 Round #18 A 計算幾何你瞎暴力(瞎暴力)

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)的距離為 |x1x2|+|y1y2|+|z1z2|

那麽有多少對教室之間的距離是不超過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--){
14
memset(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 25
26 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 計算幾何你瞎暴力(瞎暴力)