题解 P4393 【[BOI2007]Sequence 序列问题】

Solution:

对于每个很大的数,基于贪心,我们显然要让它合并次数尽可能少,以保证最终总代价最小。

如图:

考虑中间那个最大的 $maxn$,很显然,将其与其它的合并代价显然更大,所以,我们不可能先用 $maxn$ 去和其它的合并。

但是,由于最终目标长度为1,所以无论如何,$maxn$ 终将被合并,可以先考虑将比它小的全部合并,最后再与它合并,以减少它参与合并的次数。

不难想到,可以先将 $maxn$ 左边全部合并,再将其右边全部合并,最后,再让左右两部分与它合并,这样可以保证比先合并 $maxn$ 与其它的更优。

然后,该问题就被分成两个小问题,合并左边与右边。

注意到,如果一个数左边比它小,那么总有一天,总有一年会向它合并过来,也就是说,它不可避免的向左对答案产生一次贡献,右边一样同理。

若一个数左边比它大,那么它肯定会在某个时刻并上去,那么对答案产生贡献的是它左边的数,右边同理。

总之,一个数的左邻比它小,它会产生一次贡献,右舍比它小,就会再产生一次贡献,累计答案即可。

#include<bits/stdc++.h>
using namespace std;

int n,hxt[10001000];
long long ans;

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&hxt[i]);
	for(int i=2;i<=n;i++) ans+=max(hxt[i],hxt[i-1]);
	printf("%lld",ans); 
	return 0;
} 

猜你喜欢

转载自www.cnblogs.com/wxg-Jay/p/12239551.html