La 3177

来源:互联网 发布:淘宝开店2张不同银行卡 编辑:程序博客网 时间:2024/06/14 10:38
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;#define INF 0x7f7f7f7f#define MAXN (100000+5)int n;int r[MAXN];int r1[MAXN], r2[MAXN];bool check(int num_p){     int tot1 = r[1], tot2 = num_p - r[1];     if(tot2 <= 0) return false;     r1[1] = tot1; r2[1] = 0;          for(int i = 2; i <= n; i++){         if(i % 2){             r2[i] = min(tot2-r2[i-1], r[i]);             r1[i] = r[i] - r2[i];             if(r1[i]+r1[i-1] > tot1) return false;         }else{             r1[i] = min(tot1-r1[i-1], r[i]);             r2[i] = r[i] - r1[i];             if(r2[i]+r2[i-1] > tot2) return false;         }     }          return !r1[n];}int main(){    while(scanf("%d", &n) != EOF && n){            int L = 0, R = 0;        for(int i = 1; i <= n; i++){            scanf("%d", &r[i]);            if(i > 1) L = max(L, r[i-1]+r[i]);               R = max(R, r[i]*3);        }        L = max(L, r[1]+r[n]);                if(n == 1){            printf("%d\n", r[1]); continue;        }                if(n % 2){             while(L < R){                 int mid = L + (R-L)/2;                                  if(check(mid)) R = mid;                 else L = mid+1;             }        }                printf("%d\n", L);    }        return 0;}

0 0
原创粉丝点击