C++-蓝桥杯-区间移位[二分答案][multiset多重集的使用]

有一说一,check不好想

思路解析,from 这里

 1 #include <set> 
 2 #include <cstdio>
 3 #include <iostream>
 4 using namespace std;
 5 multiset<pair<int,int> >A;
 6 const int N=10000*2;
 7 int check(int mid){
 8     multiset<pair<int,int> > B(A);
 9     int pos=0;
10     while(true){
11         int flag=0;
12         for(multiset<pair<int,int> >::iterator it=B.begin();it!=B.end();it++){
13             int L=(*it).second,R=(*it).first;
14             if(L-mid<=pos&&pos<=R+mid){//可更新出新区间,pos更新要分类讨论 
15                 if(pos<=L+mid)pos+=(R-L);
16                 else pos=R+mid;
17                 flag=1,B.erase(it);
18                 break;
19             }
20         }
21         if(!flag||pos>=N)break;    
22     }
23     return pos;
24     
25 }
26 
27 double binarySearch(int l,int r){
28     int mid;
29     while(l<=r){
30         mid=(l+r)>>1;
31         if(check(mid)<N)l=mid+1;
32         else r=mid-1;
33     }
34     return l*0.5;
35 }
36 
37 int main(){
38     int L,R,n;
39     for(cin>>n;n--;){
40         cin>>L>>R;
41         L*=2,R*=2;
42         A.insert(make_pair(R,L));//按右端点为第一关键字升序排序         
43     }
44     cout<<binarySearch(0,N)<<endl; 
45     return 0;
46 } 

 

posted @ 2020-09-28 09:01  墨鳌  阅读(198)  评论(0编辑  收藏  举报