标签:class sqrt scan 灵活 mat i++ == double ++
本来是出给集训队新人做的,结果差点出成给我自己做的了...wa差点有点怀疑人生...
首先我们看到这个题目的时候,其实还是要想到建立怎么样的模型,不然就会不知道从哪里入手...我们经过分析这应该是个区间贪心问题(其实这个分析过程才是最重要的,这个可能是通过大量的练习而掌握的,或者思维灵活,可以一下子跳出来...区间贪心相关问题还可以查看刘汝佳书上p232的贪心相关问题)....
然后想到这是个区间贪心问题后,我们就该思考下一个问题,就是我们的区间应该是怎么确定的呢?我们雷达的扫描范围是一个圆,我们可以画一个图,其实就可以发现,我们的极端情况就是我们我们这个点刚好在雷达的圆弧上,我们这里可以求出一个值temp,x-temp就是左极限,x+temp就是右极限....
然后我们每次贪心的取右边的就好,如果第三个的区间小于第二个(其实不可能,只有一种情况,就是这个点的y坐标正好是圆的半径,画个图就行了)...
// // Created by luckybird on 2017/11/12. // #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; const int maxn = 1e3 + 10; struct data{ int x,y; double left,right; }num[maxn]; bool cmp(data a, data b) { return a.left <= b.left; } int main() { int n; int d; int cases = 1; while( ~scanf("%d%d", &n,&d )) { if( d == 0 && n == 0) break; int i,j; int flag = 0; for( i = 0; i < n; i++ ) { scanf("%d%d", &num[i].x,&num[i].y); if( num[i].y > d ) { flag = 1; } double temp = sqrt( (double)1.0*d*d-1.0*num[i].y*num[i].y); num[i].left = num[i].x - temp; num[i].right = num[i].x + temp; } if(flag == 1) { printf("Case %d: -1\n", cases++); continue; } sort(num,num+n,cmp); int ans = 1; double loc = num[0].right; for( i = 1; i < n; i++ ) { if(num[i].left > loc ) { ans++; loc = num[i].right; } else if( num[i].right < loc) loc = num[i].right; } printf("Case %d: %d\n", cases++,ans); } return 0; }
标签:class sqrt scan 灵活 mat i++ == double ++
原文地址:http://www.cnblogs.com/fzfn5049/p/7821632.html