| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 54143 | Accepted: 12178 |
Description
Input
Output
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2 Case 2: 1
算法分析:
刚開始不知道从哪分析,后经指点发现圆心位置是个突破口。首先得出每个点所相应的圆心位置,注意若想覆盖最多。每个圆都尽量做到使点刚好位于圆边界。比方我们左右两边各有一个水果。我们不确定是否能拿得到两个,为了使得尽量拿到两个,我们会使左手刚好触碰到一个。伸右手去抓还有一个,而不是直接以某一个为中心而忽略增大自身所能更加接近还有一个的机会,于是问题就变成了求解圆心。依照圆心排序,不断更新雷达圆心,终于使数量最小。
此外,注意代码凝视部分。。
。
圆心竖轴为0,横轴坐标计算公式:
r=x+sqrt(d*d-y*y)//圆心从左向右移动
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct island{
int x;
int y;
double z;
}island;
island land[1000];
int Comp(island a,island b)
{
return a.z<b.z;
}
int main()
{
int n,d,i,count,num=1,sign;
while(cin>>n>>d)
{
sign=0;
if(!(n||d))
break;
count=1,i=0;
while(i<n)
{
cin>>land[i].x>>land[i].y;
land[i].z=(double)land[i].x+sqrt(double(d*d-land[i].y*land[i].y)); //圆心必须浮点数啊有木有
if(abs(land[i].y)>d||d<=0) //注意。当雷达无法笼罩时的情况输出-1
sign=1;
i++;
}
if(sign)
{cout<<"Case "<<num<<": -1"<<endl;num++;continue;}
sort(land,land+n,Comp); //对圆心位置从左到右进行排序
i=1;
double a=land[0].z;
while(i<n)
{
if(!((land[i].x-a)*(land[i].x-a)+land[i].y*land[i].y<=d*d))
{
a=land[i].z;
count++;
}
i++;
}
cout<<"Case "<<num<<": "<<count<<endl;
num++;
}
return 0;
}版权声明:本文博主原创文章,博客,未经同意不得转载。
POJ 1328 Radar Installation(经典贪婪)
原文:http://www.cnblogs.com/gcczhongduan/p/4792770.html