T1:a
題目大意
小涵穿越到了一個神奇的世界,這個世界裏是一個立方體,他知道n個點的座標,已知座標(x1,y1,z1)與座標(x2,y2,z2)的距離爲|x1-x2|+|y1-y2|+|z1-z2|,現在有q個詢問,每個詢問給出一個l,求出距離不超過l的距離對數(2個座標爲一對)數量
Input
第一行爲點的個數n和詢問的個數q
第二行至第(n+1)行每行有3個數,表示每一個座標的x,y,z值
接下來q行每行有一個l
Output
每個詢問l:距離不超過l的總對數
Sample Input
3 3
0 0 0
1 1 1
1 1 1
1
2
3Sample Output
1
1
3
初見:這道題的題目意思蠻好理解的,暴力思路也很容易想,就先打出暴力再說。
打完暴力後:這道題目怎麼優化呀,一點頭緒都沒有。2333
思路:直接暴力枚舉出所有點之間的距離,然後輸出即可(小優化:存儲所有點中兩座標之間距離的最大值,如果詢問的數大於最大值,那麼所有點皆可滿足條件),但應該得不了太多分,畢竟是暴力。
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=100000+10;
int n,p,x[maxn],y[maxn],z[maxn],dp[maxn],maxx=-2147483647;
int main(){
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&x[i],&y[i],&z[i]);//輸入每個座標
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++){//枚舉出所有的對數
int dis=abs(x[i]-x[j])+abs(y[i]-y[j])+abs(z[i]-z[j]);//推導出所有點之間的距離
maxx=max(dis,maxx);//定義最大可達到距離,並逐個比較
for(int z=dis;z<=30;z++)//dis到兩點間的最大距離30的答案加一
dp[z]++;
}
for(int i=1;i<=p;i++){//詢問
int l;
scanf("%d",&l);//輸入詢問
if(l>maxx)//如果比已求出的最大距離還大
printf("%d\n",n*(n-1)/2);//所有對數皆滿足條件
else
printf("%d\n",dp[l]);//輸出答案
}
return 0;
}
經驗教訓:1.暴力算法容易想,但最終還是要回歸正解的
2.善於運用各種優化,對於大數據要想辦法分解爲小數據,化整爲零