【推導】【貪心】Codeforces Round #472 (rated, Div. 2, based on VK Cup 2018 Round 2) D. Riverside Curio

題意:海平面天天高度會變化,一我的會在天天海平面的位置刻下一道痕跡(若是當前位置沒有已經刻劃過的痕跡),而且記錄下當天比海平面高的痕跡有多少條,記爲a[i]。讓你最小化天天比海平面低的痕跡條數之和。數組

貪心,使得痕跡條數儘量小。spa

考慮處理出天天痕跡條數的數組f[i]的最小可能值。blog

知足幾個約束便可,f[i]>=f[i-1],f[i]>=a[i]+1,f[i]>=f[i+1]-1。先後掃兩遍就能夠處理出f數組,而後就能夠輕鬆統計答案了。it

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[100005],f[100005];
int main(){
	//freopen("d.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		f[i]=max(f[i-1],a[i]+1);
	}
	for(int i=n;i>=1;--i){
		f[i]=max(f[i+1]-1,f[i]);
	}
	long long ans=0;
	for(int i=1;i<=n;++i){
		ans+=(long long)(f[i]-1-a[i]);
	}
	printf("%lld\n",ans);
	return 0;
}
相關文章
相關標籤/搜索