cf1372 D. Omkar and Circle

题意:

n 个数顺序排成一个环,每次选一个位置 i,令 ai=ai1+ai+1 然后删掉 ai1,ai+1。直到剩下一个数为止。问剩下的数最大是多少

思路:

只有在最后一次操作,即环中只剩三个数时可以计入相邻的两个数,否则被计入的数在任意时刻两两不相邻

环中只剩三个数时,取其中较大的两个即是答案。考虑这三个数是怎么来的

把初始的环切成三段,每段长为奇数,每段内被计入的数两两不相邻且首尾两数一定要计入,那么这三段分别形成最后的三个数之一。

所以应在每段中选位置 1,3,5,... 的数。为了最大化三段中两段的价值,令某段的长为1

那么初始环形如 |0|10101|10101|,其中 1 表示被计入。考虑枚举后两段的分界点,则分界点处间隔为1的前缀和和后缀和加起来就是答案

ll n, a[N], l[N], r[N];
void sol() {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];

    l[1] = a[1]; for(int i = 2; i <= n; i++)
        l[i] = l[i-2] + a[i];
    for(int i = n; i; i--) r[i] = r[i+2] + a[i];

    ll ans = r[1];
    for(int i = 2; i <= n; i++) ans = max(ans, l[i-1] + r[i]);
    cout << ans;
}
posted @   Bellala  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示