Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) B. Histogram Ugliness(贪心)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) B. Histogram Ugliness(贪心)相关的知识,希望对你有一定的参考价值。

LINK

Ⅰ.对于 a i a_i ai来说,若满足 a i > a i − 1 & & a i > a i + 1 a_i>a_{i-1}\\&\\&a_i>a_{i+1} ai>ai1&&ai>ai+1

那么把 a i a_i ai减小到 m a x ( a i − 1 , a i + 1 ) \\rm max(a_{i-1},a_{i+1}) max(ai1,ai+1)不会使答案变得更差

因为花费一次操作机会代价加一,却能使代价减少 2 2 2,收益和为 − 1 -1 1

Ⅱ.若比两边都小,操作一次代价加一,另外会使代价加 2 2 2,收益和为 + 3 +3 +3

Ⅲ.若一大一小,操作一次代价加一,另外使代价不变,收益和为 + 1 +1 +1

发现只有操作Ⅰ划算,且操作Ⅰ不会影响其他位置使用操作Ⅰ,所以贪心即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 4e5+10; 
int t,n,a[maxn],b[maxn];
signed main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n;
		for(int i=1;i<=n;i++)	cin >> a[i];
		a[0] = a[n+1] = 0;
		int ans = 0;
		for(int i=1;i<=n;i++)
		{
			if( a[i]>a[i-1] && a[i]>a[i+1] )	b[i] = max( a[i-1],a[i+1] );
			else	b[i] = a[i];
			ans += abs( b[i]-b[i-1] )+a[i]-b[i];
		}
		cout << ans+b[n] << endl;
	}
	return 0;
}

以上是关于Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) B. Histogram Ugliness(贪心)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) E. Lost Array(构造)

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) B. Histogram Ugliness(贪心)

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) D. Lost Tree(交互,二分/图,思维)

D. Lost Tree树的二分图性质——Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)

D. Lost Tree树的二分图性质——Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)