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 7001≤n≤700。
本题翻译并改编自 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
                  
                  
                  
                  
                            
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					323
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            