【题目链接】
http://poj.org/problem?id=1328
【算法】
每个雷达都位于笛卡尔坐标系的x轴上,因此,对于每个岛屿,我们都可以用勾股定理算出它的有效管辖区域
那么,问题就被转化成了 : 给定若干个区间,要求每个区间内都要有一个点,最小化点的个数
我们将这些区间按左端点排序,然后贪心,即可
【代码】
#include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include <list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include <streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; #define MAXN 1010 int n,d,i,x,y,ans,TC; double dis,pos; bool flag; struct info { double l,r; } a[MAXN]; inline bool cmp(info a,info b) { return a.l < b.l; } int main() { while (scanf("%d%d",&n,&d) != EOF && n && d) { flag = false; for (i = 1; i <= n; i++) { scanf("%d%d",&x,&y); if (y > d) flag = true; dis = sqrt(d*d-y*y); a[i] = (info){x-dis,x+dis}; } if (flag) { printf("Case %d: %d ",++TC,-1); continue; } sort(a+1,a+n+1,cmp); ans = 1; pos = a[1].r; for (i = 2; i <= n; i++) { if (a[i].l > pos) { ans++; pos = a[i].r; } else pos = min(pos,a[i].r); } printf("Case %d: %d ",++TC,ans); } return 0; }