P1142轰炸
这是uva上的一道模拟题。
首先给出n(n<=700)个点的坐标(坐标在1*10^9)之内,询问走直线可以经过的点数。一开始我想到了一个类似于桶排序的方法来存坐标,但是要注意数组大小啊!第二次想到了判断行,列,对角线的方法,然后这是错误的,因为直线不一定是对角线。而正确,的方法应该是先计算两个点的向量,再继续枚举与第一个点相连的点组成的向量,计算vx1*vy2==vx2*vy1即可,然后更新最大值。
1.别僵化思维,老是联系原来的题而忽略如今的题意
2.注意看题目数据范围决定算法
3.防止出现精度问题,尽量避免除法
代码
#include<cstdio> #include<iostream> #include<string> #include<cstring> #include<algorithm> #include<cmath> #define maxn 705 using namespace std; int n,K,d; struct node{ int x; int y; }a[maxn]; int ans=0; int main(){ cin>>n; for(int i=1;i<=n;i++){ int x,y; cin>>a[i].x>>a[i].y; } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(i==j) continue; int cnt=2; int vx=a[i].x-a[j].x; int vy=a[i].y-a[j].y; for(int k=1;k<=n;k++){ if(k==i||k==j) continue; int vx_=a[i].x-a[k].x; int vy_=a[i].y-a[k].y; if(vx*vy_==vy*vx_){ cnt++; } } if(cnt>ans) ans=cnt; } } cout<<ans; return 0; }
待到oi十一月,我花开后百花杀。