P1142轰炸

这是uva上的一道模拟题。

首先给出n(n<=700)个点的坐标(坐标在1*10^9)之内,询问走直线可以经过的点数。一开始我想到了一个类似于桶排序的方法来存坐标,但是要注意数组大小啊!第二次想到了判断行,列,对角线的方法,然后这是错误的,因为直线不一定是对角线。而正确,的方法应该是先计算两个点的向量,再继续枚举与第一个点相连的点组成的向量,计算vx1*vy2==vx2*vy1即可,然后更新最大值。

1.别僵化思维,老是联系原来的题而忽略如今的题意

2.注意看题目数据范围决定算法

3.防止出现精度问题,尽量避免除法

代码

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 705
using namespace std;
int n,K,d;
struct node{
    int x;
    int y;
}a[maxn];
int ans=0;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>a[i].x>>a[i].y;
        
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(i==j) continue;
            int cnt=2;
            int vx=a[i].x-a[j].x;
            int vy=a[i].y-a[j].y;
            for(int k=1;k<=n;k++){
                if(k==i||k==j) continue;
                int vx_=a[i].x-a[k].x;
                int vy_=a[i].y-a[k].y;
                if(vx*vy_==vy*vx_){
                    cnt++;
                }    
            }
            if(cnt>ans) ans=cnt;    
        }
    }
    cout<<ans;    
    return 0;
} 
原文地址:https://www.cnblogs.com/china-mjr/p/11662968.html