0
已解决
董宇昊
初级启示者
初级启示者
4760 飞行员酷町猫
题目描述 Description
飞行员酷町猫最近需要给一个地区的若干村庄空投补给,这些村庄是平面上的一些点。由于燃料问题,酷町猫只能飞一次。而且飞机很破,只能直行而不能拐弯。现在它想一次性给最多的村庄送补给。
输入描述 Input Description
第一行为n
接下来n行由n对整数组成(1≤n≤700),每对整数表示一个点的坐标。没有一个点会出现两次。
输出描述 Output Description
一个整数,表示一条直线能覆盖的最多的点数。
样例输入 Sample Input
5
1 1
2 2
3 3
9 10
10 11
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
村庄的位置横纵坐标不超过100
0
已采纳
李素妍
新手天翼
新手天翼
我告诉你,你要回答我的问题。
这道题你仔细看你会发现——有勾股定理,因为这个我特意学了一下(我下学期五年级)
用勾股定理判断的时候是这样的:
if((y[i]-y[j])*(x[i]-x[k])==(y[i]-y[k])*(x[i]-x[j]))
注意一下这写
第一层循环1到n的循环,枚举第一个点
第二层循环从i+1到n循环,枚举第二个点{
计数器等于2,因为该直线至少包含两个点
第三层循环从j+1到n循环,枚举剩下的点
如果(y[j]-y[i])*(x[k]-x[i])=(y[k]-y[i])*(x[j]-x[i])的话,计数
取计数器最大值。
}
1
陈振轩
高级光能
高级光能
90分,不过我看了一下测试点1
发现是
输入(显示前50行):
1
50 10
输出(显示前50行):
1
加上特判
if(n==1){
cout<<1;
return 0;
}
然后结合楼上的思路
即可AC
0
0
0
0
邹昊轩
资深光能
资深光能
对不起,我只有代码,代码如下:
- for(int i=1;i<=n-1;i++){
- for(int j=i+1;j<=n;j++){
- cnt=2;
- for(int k=j+1;k<=n;k++){
- if((a[i]-a[j])*(b[j]-b[k])==(a[j]-a[k])*(b[i]-b[j])){
- cnt++;
- }
- }
- if(maxn<=cnt){
- maxn=cnt;
- }
- }
- }
cnt初值为2,最后输出maxn。这题要用枚举
0