[bzoj1863]皇帝的烦恼

二分枚举答案,假设是ans,考虑判定答案
从前往后计算,算出每一个将军与第一个将军最少和最多有多少个相同的奖牌,贪心转移即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a[20005];
 4 bool pd(int k){
 5     int mi=a[1],ma=a[1];
 6     if (k<a[n]+a[1])return 0;
 7     for(int i=2;i<=n;i++){
 8         if (k<a[i]+a[i-1])return 0;
 9         int x=max(a[i]-(k-a[i-1]-(a[1]-ma)),0);
10         ma=min(a[i],a[1]-mi);
11         mi=x;
12     }
13     return mi==0;
14 }
15 int main(){
16     scanf("%d",&n);
17     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
18     int l=1,r=300000;
19     while (l<r){
20         int mid=(0LL+l+r>>1);
21         if (pd(mid))r=mid;
22         else l=mid+1;
23     }
24     printf("%d",l);
25 }
View Code

 

posted @ 2019-11-15 14:17  PYWBKTDA  阅读(132)  评论(0编辑  收藏  举报