Omkar and Circle(CodeForces 1372D)

【题意】一共奇数个数字首尾相连围成一圈,一次操作可以删除圈上的一个数字,则其旁边相邻的两个数字合并为新数字,值为二者和。问通过若干次这样的操作,剩下的最后一个数字最大为多少?


【数据范围】数字个数 1 ≤ n < 2 ⋅ 1 0 5 1\le n<2\cdot 10^5 1n<2105 n n n为奇数,每个数字 a i ∈ [ 0 , 1 0 9 ] a_i \in [0,10^9] ai[0,109]


【题解】
这是一道思维题。

通过数学归纳法证明,合并产生的新数字被删不会使结果更优:

1. n = 5 n=5 n=5时, a 1 , a 2 , a 3 , a 4 , a 5 a_1,a_2,a_3,a_4,a_5 a1,a2,a3,a4,a5围成一圈:
不妨设第一次删除的数为 a 1 a_1 a1(删除其他数同理),
则环变为 a 2 + a 5 , a 3 , a 4 a_2+a_5,a_3,a_4 a2+a5,a3,a4围成一圈。
若第二次删除数为 a 2 + a 5 a_2+a_5 a2+a5,得到的结果为 a 3 + a 4 a_3+a_4 a3+a4
但若是换种方案,依次删除数 a 2 , a 5 a_2,a_5 a2,a5,便可得结果为 a 1 + a 3 + a 4 a_1+a_3+a_4 a1+a3+a4
由于 a i ≥ 0 a_i\ge0 ai0,可知, a 1 + a 3 + a 4 ≥ a 3 + a 4 a_1+a_3+a_4\ge a_3+a_4 a1+a3+a4a3+a4
即,对于 n = 5 n=5 n=5而言,命题成立。

2.假设 n = N n=N n=N时,满足删除合并产生的新数字不会使结果更优这一性质,
则当 n = N + 2 n=N+2 n=N+2时,有 a 1 , a 2 , a 3 … … a N + 1 , a N + 2 a_1,a_2,a_3……a_{N+1},a_{N+2} a1,a2,a3aN+1,aN+2围成一圈,
不妨设第一次删除的数为 a 1 a_1 a1(删除其他数同理),
则环变为 a 2 + a N + 2 , a 3 … … a N + 1 a_2+a_{N+2},a_3……a_{N+1} a2+aN+2,a3aN+1围成一圈,
在后续删除过程中,若通过删除数字 a 2 + a N + 2 a_2+a_{N+2} a2+aN+2
来合并某两个数字 A i , A j A_i,A_j Ai,Aj,得到新环 … … , A i + A j , … … ……,A_i+A_j,…… ,Ai+Aj,
必定可以通过先删除数字 a 2 a_2 a2 a N + 2 a_{N+2} aN+2而不删除 a 1 a_1 a1
来得到环 … … , A i + A j + a 1 , … … ……,A_i+A_j+a_1,…… ,Ai+Aj+a1,(两环的省略号部分数字完全相同)
又因为 A i + A j + a 1 ≥ A i + A j A_i+A_j+a_1\ge A_i+A_j Ai+Aj+a1Ai+Aj,显然删除数字 a 2 + a N + 2 a_2+a_{N+2} a2+aN+2不会比后者方案更优。
即,只要删除过 a 1 a_1 a1,后续操作中删除 a 2 + a N + 1 a_2+a_{N+1} a2+aN+1只可能使结果变小,不可能变大。
n = N + 2 n=N+2 n=N+2环进行一次删除操作后变为 n = N n=N n=N环,
由前面的假设 n = N n=N n=N可知,后续操作中的通过合并产生的数字也不应被删,
又有第一次合并产生数字 a 2 + a N + 2 a_2+a_{N+2} a2+aN+2也不会被删,所以有 n = N + 2 n=N+2 n=N+2同样满足这一性质

3.综上所述,命题“合并产生的新数字被删不会使结果更优”得证


根据所得性质可知,不妨设最优解是只删除未合并过的数字,

则一共删除数字 ⌊ n 2 ⌋ \left \lfloor \frac{n}{2} \right \rfloor 2n个,则有最优解是 ⌊ n 2 + 1 ⌋ \left \lfloor \frac{n}{2}+1 \right \rfloor 2n+1 a i a_i ai求和而成,

且对答案产生贡献的 a i a_i ai有且只有一对是起始位置相邻的,剩下的均为隔一个取一个。

因此枚举相邻的那一对 a i , a i % n + 1 a_i,a_{i\%n+1} ai,ai%n+1,剩下对最优解有贡献的 a i a_i ai位置便确定了。


通过倍长数组的方式,将相邻一对从中断开化为链,用前缀和维护,

即可在确定相邻一对数字情况下, O ( 1 ) O(1) O(1)求出最优解。


【复杂度】总时间与总空间复杂度均为 O ( n ) O(n) O(n)级别


【反思】在遇到思维题的时候,没有切实动手模拟各种数据,以至于未发现其内在规律。手动计算一些小数据的求解过程,有助于思路的打开。


【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+10;
ll a[N],s1[N],s2[N];
int main()
{
  int n;
  while (~scanf("%d",&n))
  {
    ll ans=0;
    for(int i=1;i<=n;i++)
      {scanf("%lld",&a[i]);a[i+n]=a[i];}
    for(int i=1;i<=n*2;i++)
      if (i&1) s1[i]=s1[i-1]+a[i],s2[i]=s2[i-1];
        else s1[i]=s1[i-1],s2[i]=s2[i-1]+a[i];
    for(int i=1;i<=n;i++)
      if (i&1) ans=max(ans,s1[i+n-1]-s1[i-1]);
        else ans=max(ans,s2[i+n-1]-s2[i-1]);
    printf("%lld\n",ans);
  }
  return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值