时间限制:1 s 内存限制:256 MB
【题目描述】
“听说咱们要完了?”比利·海灵顿拨弄着操纵杆,头也不回地问Asm.Def。
“不要听得风就是雨。”
“开个玩笑嘛。不就是打机器人,紧张啥,你看人家凯尔·里斯,还能顺便谈个恋爱……”
这时空天飞机陡然抬起机头, Asm.Def被紧紧压在座椅上。不一会,仪表盘上的青蛙玩偶飞了起来,表明他们已经进入近地轨道。
“华莱士比你还紧张,听说是要去什么无……”
“无线电焦点,在那能监听到透明计算网络控制的所有卫星。而且是已经去过了,所以我才会在这儿。”Asm.Def回答。
“这我知道,送你去拉格朗日点,你们的‘蓝翔’号星舰,只是有个小问题:没油了。”
“什么?!”
“我们可以去废弃卫星上找燃料。现在就差一个程序员。”
我们把太空看做一个二维平面。有N颗废弃卫星,第i颗的坐标是(xi,yi)。Asm.Def希望从尽可能多的卫星获取燃油,但他乘坐的空天飞机的飞行路径只能是一条直线,Asm.Def需要知道,这条直线最多能经过多少颗卫星。
【输入格式】
第1行1个整数N。
接下来N行,每行两个整数xi,yi,表示第i颗卫星的坐标。
【输出格式】
一行一个整数,即一条直线最多能经过多少颗卫星。
【样例输入】
6 0 0 0 2 2 0 2 2 1 1 0 0
【样例输出】
4
【提示】
对于30%的数据,1<=N<=10.
对于100%的数据,1<=N<=100,坐标为整数,绝对值<=10000.
写水题舒缓一下心情
数学问题 计算几何 暴力
这系列的题,题面都好神啊……
看了看数据范围,暴力怼过去好了。
$O(n^2)$枚举两点,然后$O(n)$判有多少点在线上
完毕
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const double eps=1e-7; 10 const int mxn=110; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 struct point{ 18 double x,y; 19 point operator + (point b){return (point){x+b.x,y+b.y};} 20 point operator - (point b){return (point){x-b.x,y-b.y};} 21 double operator * (point b){return x*b.x+y*b.y;} 22 }a[mxn]; 23 double Cross(point a,point b){return a.x*b.y-a.y*b.x;} 24 int ans=0; 25 int n; 26 void solve(point st,point ed){ 27 int res=0; 28 for(int i=1;i<=n;i++){ 29 if(fabs(Cross(a[i]-st,ed-st))<eps && ((a[i]-st)*(a[i]-ed)<=0))res++; 30 } 31 ans=max(ans,res); 32 } 33 int main(){ 34 freopen("asm_fuel.in","r",stdin); 35 freopen("asm_fuel.out","w",stdout); 36 int i,j; 37 scanf("%d",&n); 38 for(i=1;i<=n;i++) 39 scanf("%lf%lf",&a[i].x,&a[i].y); 40 for(i=1;i<=n;i++){ 41 for(j=1;j<=n;j++){ 42 if(i==j)continue; 43 solve(a[i],a[j]); 44 } 45 } 46 cout<<ans<<endl; 47 return 0; 48 }