poj1328

来源:互联网 发布:爱肯拿天峻授权淘宝店 编辑:程序博客网 时间:2024/05/21 20:46

这题使用贪心的思想,对岛屿在x轴上覆盖位置的靠左边的坐标排序,然后便是尽量少放置雷达,我的解法是把点按横坐标排序,然后把每个点的雷达尽量往右放,然后每放一个雷达都要保证雷达左面的岛都被雷达所覆盖。所以我们可以按一个点靠右放完雷达后,再根据后面的在雷达位置左面的点,把雷达向左移。一个雷达经过了移的过程,就一定是能覆盖左面的岛。

代码如下:

#include<iostream>#include<cmath>using namespace std;const int MAXN = 10002;struct Island{double l_min,l_max;}area_on_beach[MAXN];int cmp(const void *a,const void *b){return (*(Island *)a).l_min <= (*(Island *)b).l_max ? 1:-1;}int main(){double n(0),d(0);bool flag;int count(1);while(cin>>n>>d){if(n==0&&d==0)break;flag = true;for(int i=0;i<n;i++){double x_island,y_island;cin>>x_island>>y_island;if(y_island<=d){area_on_beach[i].l_min=sqrt(d*d-y_island*y_island)+x_island;area_on_beach[i].l_max=x_island-sqrt(d*d-y_island*y_island);}else{flag=false;break;}}if(flag==false){cout<<-1<<endl;continue;}qsort(area_on_beach,n,sizeof(Island),cmp);int amount = 1;double buff = area_on_beach[0].l_max;for(int i=1;i<n;i++){if(area_on_beach[i].l_min>buff){amount++;buff=area_on_beach[i].l_max;}else{if(area_on_beach[i].l_max<buff)buff=area_on_beach[i].l_max;}}cout<<"Case "<<count<<": "<<amount<<endl;count++;}return 0;}

原创粉丝点击