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; }
原文地址:https://www.cnblogs.com/wxg-Jay/p/12239551.html
时间: 2024-10-10 04:23:03