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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值