RQNOJ 轰炸

来源:互联网 发布:知乎经典问答荟萃 编辑:程序博客网 时间:2024/04/19 23:36

题目描述

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

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

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

输入格式

输入数据由n对整数组成(1<n<700),每对整数表示一个点的坐标。没有一个点会出现两次。

输出格式

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

样例输入

5
1 1
2 2
3 3
9 10
10 11


样例输出

3

题解

rqnoj也是很逗,网页上竟然没有“5”,害得我wa了n次。

这一题要注意的是:除法会很慢,所以要用标准式中的a,b,c判定三点是否共线。

数据太水,所以这是暴力。

#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<cmath>using namespace std;struct point{int x,y;} p[710];int solve(int n) {    int a, b, c, counts, ans = -1;    for(int i=1;i<=n;i++)     for(int j=i+1;j<=n;j++){a=p[j].y-p[i].y;  //一般直线方程系数  b=p[i].x-p[j].x; c=p[i].y*p[j].x-p[i].x*p[j].y; counts=0;    for(int k=1;k<=n;k++){if (a*p[k].x+b*p[k].y+c == 0) ++counts;        }    ans=max(counts,ans);    }    return ans;} int main() {    int n;    scanf("%d",&n);    for (int i=1;i<=n;i++) scanf("%d%d", &p[i].x, &p[i].y);    int ans = solve(n);    printf ("%d\n", ans);    return 0;}




0 0
原创粉丝点击