BZOJ 3761 甄嬛 二分答案

由于分类的关系强行开个新帖。。

C有内存加成,1040KB->980KB。暂时Rank 8.

题解参见:

http://blog.csdn.net/huanghongxun/article/details/50759196

#include <stdio.h>
#define min(i,j) ((i)<(j)?(i):(j))
#define max(i,j) ((i)>(j)?(i):(j))
#define FOR(i,j,k) for(i=j;i<=k;i++)
int main() {
    static int a[20001], ma[20001], mi[20001];
    int n, i, ans = 0, l, r, mid;
    scanf("%d", &n);
    FOR(i,1,n) scanf("%d", a + i);
    FOR(i,2,n) ans = max(ans, a[i] + a[i - 1]);
    l = ans, r = ans * 2;
    while (l <= r) {
        mid = l + r >> 1; ma[1] = mi[1] = a[1];
        FOR(i,2,n)
            ma[i] = min(a[i], a[1] - mi[i - 1]),
            mi[i] = max(0, a[i] - (mid - a[i - 1] - (a[1] - ma[i - 1])));
        if (!mi[n]) r = mid - 1; else l = mid + 1;
    }
    printf("%d", l);
    return 0;
}


你可能感兴趣的:(动态规划,OI,bzoj,二分答案)