贪心法,区间覆盖问题。蓝书开始这几道题还真是水啊。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include<iostream> #include<algorithm> #include<vector> #include<cmath> using namespace std; struct sp{ double o,r,l1,l2; bool operator <(const sp &a)const{ if(l1==a.l1) return l2<a.l2; else return l1<a.l1; } }; int main(){ int n,l; double w; while(cin>>n>>l>>w){ w/=2; vector<sp> a; sp t; while(n--){ cin>>t.o>>t.r; if(t.r>w){ double k=sqrt(t.r*t.r-w*w); t.l1=t.o-k; t.l2=t.o+k; if(t.l1<0) t.l1=0; if(t.l2>l) t.l2=l; a.push_back(t); } } sort(a.begin(),a.end()); bool flag=false; int cnt=0,last=0; double now=0,maxn=0; while(now<l){ for(int i=last;i<a.size();i++){ if(a[i].l1<=now){ maxn=max(maxn,a[i].l2); last++; flag=true; } else break; } if(flag) flag=false; else{ cnt=-1; break; } now=maxn; cnt++; } cout<<cnt<<endl; } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **