洛谷 P1142 轰炸
题目描述
“我该怎么办?”飞行员klux向你求助。
事实上,klux面对的是一个很简单的问题,但是他实在太菜了。
klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。
输入输出格式
输入格式:
第一行为n
输入数据由n对整数组成(1<=n<=700),每对整数表示一个点的坐标。没有一个点会出现两次。
输出格式:
一个整数,表示一条直线能覆盖的最多的点数。
输入输出样例
说明
本题翻译并改编自uva270,数据及解答由uva提供。
题解:
主要就是暴力枚举和判断两点是否在同一条直线上啊;
找到公式就好了。
(x[zzz]-x[z])*(y[zzz]-y[zz])==(y[zzz]-y[z])*(x[zzz]-x[zz])
90分,TLE了一个点。
1 #include<cstdio> 2 int max(int x,int y) 3 { 4 return x>y?x:y; 5 } 6 int x[1007],y[1007]; 7 bool check(int z,int zz,int zzz) 8 { 9 return (x[zzz]-x[z])*(y[zzz]-y[zz])==(y[zzz]-y[z])*(x[zzz]-x[zz])?true:false; 10 } 11 int n,ans,answer=0; 12 int main() 13 { 14 scanf("%d",&n); 15 for(int i=1; i<=n; i++) 16 scanf("%d%d",&x[i],&y[i]); 17 for(int i=1; i<n; i++) 18 { 19 for(int j=i+1; j<=n; j++) 20 { 21 ans=2; 22 for(int k=1; k<=n; k++) 23 { 24 if(k==i||k==j) continue; 25 if(check(i,j,k)) ans++; 26 } 27 answer=max(answer,ans); 28 } 29 } 30 printf("%d",answer); 31 return 0; 32 } 33 /* 34 5 35 1 1 36 2 2 37 3 3 38 9 10 39 10 11 40 41 3 42 */