您的位置:首页 > 其它

pku1106Transmitters

2010-08-07 21:11 176 查看
题目链接:pku1106

题意:已知一半圆的圆心及半径,还有一些点,判断半圆中最多可有几个点。

本题难点在于将题意理解透彻,了解叉积的意义。

代码:叉积及判断点在圆内部

]//1-150 unique point
//先把到圆心距离大于半径的删除掉,枚举每个点所在的直径,
//统计一下在其下方的点的个数,取最大值

#include <iostream>
#include <cmath>
using namespace std;
struct point
{
double x,y;
};
//判断点p是否在以c为圆心,r为半径的圆内
bool p_in_circle(point p,point c,double r)
{
if(sqrt((p.x-c.x)*(p.x-c.x)+(p.y-c.y)*(p.y-c.y))<=r)
return true;
return false;
}
double multi(point p0,point p1,point p2)
{   return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); }

int main(int argc, char *argv[])
{
point p[155],q[155];
double r;
int n,ans,temp;
int i,j,k;
while(cin>>p[0].x>>p[0].y>>r)
{
if(r<0)break;
cin>>n;
for(i=1;i<=n;i++)
cin>>p[i].x>>p[i].y;j=0;
for(i=1;i<=n;i++)
if(p_in_circle(p[i],p[0],r)==true)q[j++]=p[i];
ans=0;
for(i=0;i<j;i++)
{
for(k=0,temp=0;k<j;k++)
if(multi(p[0],q[k],q[i])>=0)temp++;
if(temp>ans)ans=temp;
}
cout<<ans<<endl;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: