2019-08-10 考試反思

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
3

Sample 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.善於運用各種優化,對於大數據要想辦法分解爲小數據,化整爲零

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章