打卡信奥刷题(943)用C++实现信奥 P1142 轰炸

P1142 轰炸

题目描述

“我该怎么办?”飞行员 klux 向你求助。

事实上,klux 面对的是一个很简单的问题,但是他实在太菜了。

klux 要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux 遇到了抵抗,所以 klux 只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。

输入格式

第一行一个整数 nnn

接下来 nnn 行,每行有一对整数,表示一个点的坐标。没有一个点会出现两次。

输出格式

一个整数,表示一条直线能覆盖的最多的点数。

输入输出样例 #1

输入 #1

5
1 1
2 2
3 3
9 10
10 11

输出 #1

3

说明/提示

数据范围

对于全部数据,保证 1≤n≤7001\le n\le 7001n700

本题翻译并改编自 uva270,数据及解答由 uva 提供。

C++实现

#include
using namespace std;
struct point{
int x,y;
};
int main(){
int n;
cin>>n;
point p[n];
for (int i=0;i<n;i++){
cin>>p[i].x>>p[i].y;
}
int max=0;
for (int i=0;i<n-1;i++){
for (int j=i+1;j<n;j++){//任取两点i,j,姑且记为I、J吧
int cnt=2;//IJ上本就有I、J两点
point vec1;//用点坐标代替向量IJ(此处应该有“→”)
vec1.x=p[j].x-p[i].x;
vec1.y=p[j].y-p[i].y;//IJ=(xj-xi,yj-yi)
for (int h=0;h<n;h++){//枚举异于i、j的所有点
if (hi || hj) continue;
point vec2;//同样的方法计算向量IH
vec2.x=p[h].x-p[i].x;
vec2.y=p[h].y-p[i].y;
if (vec1.xvec2.y==vec1.yvec2.x){
cnt++;//直线IJ上的点+1
}
}
if (cnt>max) max=cnt;
}
}
cout<<max;
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值