Radar Installation
Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 51377Accepted: 11527
思路 : 每個島都在X軸上有一個區間可以被雷達覆蓋,x1爲可覆蓋的左端點,x2爲可覆蓋的右端點,x1,x2關於島的X對稱。
先對島以x排序,然後貪心。
將第一個島的區間 len[ i ].right與其後的島與區間len[ k ].left比如果前者大則繼續與後面的比反之則將區間更新到後者的區間範圍 此時ans+1(注意如果有島嶼的區間
len [ k ].right<前者的區間 len[ i ].right 則將區間更新到len[ k ].right) 在繼續比下去;
總之就是讓雷達在滿足當前情況的前提下儘量往右方。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<stdlib.h>
using namespace std;
struct Class{
double x;
double y;
}zb[1005];
struct Std{
double s;
double e;
}len[1005];
double r;
int ans,n;
bool cmp(Class a,Class b)
{
return a.x<b.x;
}
void worklen()//將每個島嶼各自對應的能夠放雷達的區域計算出來
{
for(int i=0;i<n;i++)
{
/*cout<<len[i].s<<" "<<len[i].e<<endl;*/
len[i].s=zb[i].x-sqrt(r*r-(zb[i].y*zb[i].y));
len[i].e=zb[i].x+sqrt(r*r-(zb[i].y*zb[i].y));
}
}
void work()
{
int j;
int l=0;
for(j=1;j<n;j++)
{
if(len[j].e<len[l].e)
{
l=j;//當有第j個島嶼雷達的放置區比l個島嶼的小時 注意要把最小的作爲比較標準
}
else if(len[l].e<len[j].s)
{
ans++;
l=j;
}
}
return ;
}
int main()
{
int i,flag,t=1;
while(cin>>n>>r,n||r)
{
flag=0;
ans=1;
for(i=0;i<n;i++)
cin>>zb[i].x>>zb[i].y;
for(i=0;i<n;i++)
if(fabs(zb[i].y)>r)
{
flag=1;
}
if(flag)
{
cout<<"Case "<<t<<": "<<"-1"<<endl;
t++;
}
else
{
sort(zb,zb+n,cmp);
/*for(i=0;i<n;i++)
cout<<zb[i].x<<" "<<zb[i].y<<endl;*/
worklen();
work();
cout<<"Case "<<t<<": "<<ans<<endl;
t++;
}
}
return 0;
}