标签:dde 描述 直接 过程 typedef osi ade lse close
输出文件仅一行,包含一个整数表示每个城镇最多能够收养的贫困儿童数量。
样例输
4
20 30
40 400
340 700
360 600
415思路:因为A,B范围较大,二分答案
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=100000+10,inf=0x3f3f3f3f; 5 typedef long long ll; 6 int a[maxn],b[maxn]; 7 int n,mx=0,mn=inf; 8 bool check(int x){ 9 ll follow=0; 10 for(int i=1;i<n;i++){ 11 ll y=b[i]+follow; 12 if(y<x){ 13 follow=y-x+(a[i]-a[i+1]);//向后边借 14 } 15 else{ 16 follow=y-x-(a[i+1]-a[i]);//向后边送 17 if(follow<0) follow=0;//若多出的不够路费,不送 18 } 19 } 20 return b[n]+follow>=x;//判断最后是否符合要求,因为前面操作确保1到n-1符合 21 } 22 void solve(){ 23 int l=mn,r=mx; 24 while(l<r){//不能写l<=r,可能会死循环,若l==4,r==4,mid==4符合,r==4,有=,l一直等于4 25 int mid=(l+r+1)>>1;//+1避免死循环 26 if(check(mid)) l=mid; 27 else r=mid-1; 28 } 29 printf("%d\n",l); 30 } 31 int main(){ 32 scanf("%d",&n); 33 for(int i=1;i<=n;i++){ 34 scanf("%d%d",&a[i],&b[i]); 35 mn=min(mn,b[i]); 36 mx=max(mx,b[i]);//求出二分范围 37 } 38 solve(); 39 return 0; 40 }
二分答案
原文地址:https://www.cnblogs.com/HZOIDJ123/p/13339697.html