题目链接:http://poj.org/problem?id=1106
Description

Input
Output
Sample Input
25 25 3.5 7 25 28 23 27 27 27 24 23 26 23 24 29 26 29 350 200 2.0 5 350 202 350 199 350 198 348 200 352 200 995 995 10.0 4 1000 1000 999 998 990 992 1000 999 100 100 -2.5
Sample Output
3 4 4
Source
题意:
给定一些点,和一个圆心坐标和半径,求一个半圆能最多能圈下多少点,半圆可绕着圆心任意旋转。
PS:
只需要考虑到圆心距离小于或者等于半径的那些点,
把符合条件的点全部存入一个数组tt[],
然后二重循环枚举每一个点与圆心所连的直线的的左侧有多少个点(叉积),
记录最大值即可。
叉积丶点积:http://blog.csdn.net/y990041769/article/details/38258761
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct node
{
double x, y;
} p[100017],tt[100017];
double cross(node A,node B,node C)//叉积
{
return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);
}
double dis(node A,node B)//距离
{
return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
}
int main()
{
double r;
node c;
while(~scanf("%lf%lf%lf",&c.x,&c.y,&r))
{
if(r < 0)
{
break;
}
int n;
scanf("%d",&n);
int k = 0;
for(int i = 0; i < n; i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
double d = dis(c,p[i]);
if(d <= r*r)
{
tt[k].x = p[i].x;
tt[k].y = p[i].y;
k++;
}
}
int ansmax = 0;
for(int i = 0; i < k; i++)
{
int cont = 1;
for(int j = 0; j < k; j++)
{
if(i!= j && cross(c,tt[i],tt[j])>=0)
{
cont++;
}
}
if(cont > ansmax)
{
ansmax = cont;
}
}
printf("%d\n",ansmax);
}
return 0;
}
原文地址:http://blog.csdn.net/u012860063/article/details/45876319