测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40833. 区间移位

填空题 困难

题目描述

区间移位

题目描述

参考答案

#include <bits/stdc++.h> using namespace std; int n; struct section { int l; int r; }s[10005]; bool cmp(section a,section b) { if(a.r!=b.r)return a.r<b.r; else return a.l<b.l; } bool check(int mid) { int i; int pos=0;//pos记录当前已经填好的区间的最末端 bool vis[10005]={0}; while(1) { bool find=false; for(i=1;i<=n;i++) { if(vis[i])continue; if(s[i].l>pos)//当前区间需要往左靠拢 { if(s[i].l-pos>mid)//这一段不能满足 { find=false; } else { pos=s[i].r-(s[i].l-pos); vis[i]=1; find=true; } } else if(s[i].l==pos) { pos=s[i].r; vis[i]=1; find=true; } else { if(pos-s[i].l<=mid) { pos=s[i].r+(pos-s[i].l); vis[i]=1; find=true; } else { if(s[i].r+mid>pos) { pos=s[i].r+mid; vis[i]=1; } find=true; } } } if(pos>=20000)return true; if(!find)break; } //这里别忘记改 return false; } int main() { int i; cin>>n; for(i=1;i<=n;i++) { scanf("%d%d",&s[i].l,&s[i].r); s[i].l*=2; s[i].r*=2; } sort(s+1,s+n+1,cmp); int left=0,right=20000,mid,ans=0; while(left<right) { mid=(left+right)/2; if(check(mid)) { right=mid; } else left=mid+1; } ans=left; if(ans%2==0) { cout<<ans/2; } else { double aans=ans/2.0; printf("%.1lf",aans); } return 0; }
上一题 下一题