uva 10382區間覆蓋貪心
阿新 • • 發佈:2019-02-13
這個題的貪心的方法就是一開始把所有點能夠覆蓋的範圍,按照左邊從小打到排序,然後就可以不斷更新右邊最大,如果一個點的左範圍小於有點最大,但是右範圍大於右邊最大,那麼就需要更新右邊最大了,然後就這樣不斷更新就可以。最後有一個就是,從這個0到L 最後一個點的左範圍不能超出L
如果找不到一個點來更新右邊最大的時候,就可以說無法覆蓋輸出-1
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <vector> #include <map> #include <queue> #include <math.h> #include <stack> #include <utility> #include <string> #include <sstream> #include <cstdlib> #define LL long long using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 100000 + 10; int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; double l,w; int n; struct P { double l,r; } pt[maxn]; bool cmp(P a,P b) { return a.l < b.l; } int main() { while(scanf("%d%lf%lf",&n,&l,&w) != EOF) { int num = 0; double h = w / 2.0; for(int i = 0; i < n; i++) { double a,b; cin>>a>>b; double t = sqrt(b*b - (h*h)); pt[i].l = a - t; pt[i].r = a + t; } sort(pt,pt + n,cmp); double R = l; double L = 0; int ans = 0; int flag = 0; double maxr; while(L<R) { maxr=0; for(int i=0; i<n; i++) if( pt[i].l-L < 1e-9 && maxr - pt[i].r <1e-9 ) maxr = pt[i].r; if(fabs(maxr-L)<1e-9) { flag = 1; break; } ans++; L=maxr; } if(flag == 1) printf("-1\n"); else printf("%d\n",ans); } return 0; }