树不要皮,必死无疑;人不要脸,天下无敌|

Tx_Lcy

园龄:2年8个月粉丝:6关注:6

CF1372D Omkar and Circle

题目传送门

思路

这是一道非常简单的 2100

既然他样例给的那么简单,说明这是一道结论题。

于是我们可以手玩几组数据试试。

例如 3,5,9,8,12 这组,发现最优方案是选择 5,9,12。假设我们从 9 开始断环成链,那么变成 9,8,12,3,59,12,5 刚好每两个之间都相差 1

于是我们可以总结出一个规律:从某个点开始断环成链,然后隔一个点跳,找出最大值。

于是前缀和后缀和乱搞即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int const N=1e6+10;
int a[N],sum1[N],sum2[N],Sum1[N],Sum2[N];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n;cin>>n;
    for (int i=1;i<=n;++i) cin>>a[i];
    for (int i=1;i<=n;++i){
        sum1[i]=sum1[i-1],sum2[i]=sum2[i-1];
        if (i&1) sum1[i]+=a[i];else sum2[i]+=a[i];
    }
    for (int i=n;i;--i){
        Sum1[i]=Sum1[i+1],Sum2[i]=Sum2[i+1];
        if (i&1) Sum1[i]+=a[i];else Sum2[i]+=a[i];
    }
    int ans=0;
    for (int i=1;i<=n;++i)
        if (i&1) ans=max(ans,sum1[i]+Sum2[i+1]);
        else ans=max(ans,sum2[i]+Sum1[i+1]);
    cout<<ans<<'\n';
    return 0;
}

本文作者:Tx_Lcy

本文链接:https://www.cnblogs.com/tx-lcy/p/16872445.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Tx_Lcy  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起