【贪心】Radar Installation(poj 1328)
生活随笔
收集整理的這篇文章主要介紹了
【贪心】Radar Installation(poj 1328)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Radar Installation
poj 1328
題目大意:
在平面直角坐標系的一二象限上有n個小島,現在讓你在x坐標上布置雷達,每個雷達可以偵測以它為原心,半徑為m的圓內的所有小島,現在問偵測完這n個小島最少要多少個雷達
輸入樣例
3 2 1 2 -3 1 2 11 2 0 20 0輸出樣例
Case 1: 2 Case 2: 1數據范圍
1?n?10001\leqslant n\leqslant 10001?n?1000
解題思路:
把每個點可以被哪個范圍內雷達偵測到記錄下來,然后按范圍的最尾端從小到大排序,然后每一次在需要安裝雷達的范圍的最右端安裝雷達,這樣可以讓更多的點被偵測到
代碼:
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,t,pp,ans; double x,y,m,k; struct rec {double bg,ed; }a[1500]; bool cmp(rec x,rec y){return x.ed<y.ed||x.ed==y.ed&&x.bg<=y.bg;} int main() {scanf("%d %lf",&n,&m);while(n){++t;pp=0;for (int i=1;i<=n;++i){scanf("%lf %lf",&x,&y);if (y>m) pp=1;a[i].bg=x-sqrt(m*m-y*y);//計算范圍a[i].ed=x+sqrt(m*m-y*y);}if (pp)//離x軸的坐標大于m則無解{printf("Case %d: -1\n",t);scanf("%d %lf",&n,&m);continue;}sort(a+1,a+1+n,cmp);//排序ans=1;k=a[1].ed;//最后面的雷達for (int i=2;i<=n;++i)if (a[i].bg>k)//沒有被偵測到ans++,k=a[i].ed;//新建一個printf("Case %d: %d\n",t,ans);scanf("%d %lf",&n,&m);} }總結
以上是生活随笔為你收集整理的【贪心】Radar Installation(poj 1328)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雷军宣布小米14将在全球推出 海外网友:
- 下一篇: 《流浪地球 2》联名周边:闪极 Mags