【题意】一共奇数个数字首尾相连围成一圈,一次操作可以删除圈上的一个数字,则其旁边相邻的两个数字合并为新数字,值为二者和。问通过若干次这样的操作,剩下的最后一个数字最大为多少?
【数据范围】数字个数 1 ≤ n < 2 ⋅ 1 0 5 1\le n<2\cdot 10^5 1≤n<2⋅105 且 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
ai≥0,可知,
a
1
+
a
3
+
a
4
≥
a
3
+
a
4
a_1+a_3+a_4\ge a_3+a_4
a1+a3+a4≥a3+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,a3……aN+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,a3……aN+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+a1≥Ai+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;
}