标签:ini ack turn des amp scan air tin com
题目网址:http://poj.org/problem?id=1328
题目:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 88789 | Accepted: 19915 |
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
思路:
当海岛到x轴的距离超过d时,必定不能覆盖输出-1。否则,以海岛为圆心,雷达覆盖范围为半径做圆,得到圆与x轴的交点。分别记录n个海岛的左交点和右交点。
将区间按照右交点升序排序,遍历区间,找到不能包含当前区间的右交点的区间,雷达数加一。(贪心算法)
代码:
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 struct node{ 7 double l,r; 8 }; 9 vector<node>v,vt; 10 int n,d; 11 int flag; 12 int ind=0; 13 bool cmp(node x,node y){ 14 return x.r<y.r;//注意是按照右交点排序 15 } 16 int main(){ 17 int x,y; 18 while (scanf("%d%d",&n,&d)!=EOF && (n!=0 || d!=0)) { 19 int res=0; 20 printf("Case %d: ",++ind); 21 v.clear(); 22 flag=0; 23 for (int i=0; i<n; i++) { 24 scanf("%d%d",&x,&y); 25 if(fabs(y)>d) flag=1; 26 node t; 27 t.l=x-sqrt(d*d-y*y);//左交点 28 t.r=x+sqrt(d*d-y*y);//右交点 29 v.push_back(t); 30 31 } 32 if(flag){ 33 printf("-1\n"); 34 continue; 35 } 36 sort(v.begin(), v.end(), cmp); 37 int j=0; 38 while(j<v.size()){ 39 double r=v[j].r; 40 int t=j; 41 while(v[j+1].l<=r && v[j+1].r>=r ) j++;//找到一个区间不包含外层区间的右交点 42 j++; 43 res++; 44 } 45 printf("%d\n",res); 46 } 47 return 0; 48 }
POJ 1328 Radar Installation(贪心)
标签:ini ack turn des amp scan air tin com
原文地址:http://www.cnblogs.com/uniles/p/7220978.html