问题标题: 酷町堂:4760 飞行员酷町猫

0
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
王子逸
王子逸
新手天翼
新手天翼

这是作业题!!!!!

不能问的!

提示:要用勾股算长度a²+b²=c²

王子逸在2020-08-24 13:25:06追加了内容

我前几天才做的 这个老师上课会讲 !!

我要回答