codeforces#331-B.Wilbur and Array-貪欲

1080 ワード

http://codeforces.com/contest/596/problem/B
n個の数を与える配列B【】
初期化A【】は全ゼロで、少なくとも何回操作してB【】を得ることができますかを聞きます
操作は2種類あり,1はiからnに1を加え,2はiからnを1に減らす.
左から右へ遍歴し、増加する場合はmax_を操作するだけです.value回でいい
突然減少した場合、i番目のノードがi-1より小さいとすると、sumはb[i-1]-b[i]を加える必要がある
増えればまた続くので、onは何度も走って答えを得ます.
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
__int64 max(__int64 a,__int64 b)
{return a>b?a:b;}
__int64 tm[200000+20]; 
int main()
{
	__int64 i,j,k,t,m,n;
	scanf("%I64d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%I64d",&tm[i]);
	}
	__int64 sum=0;
	__int64 maxx=0;

	for(i=1;i<=n;i++)
	{
		if (tm[i]>=tm[i-1]) 
		continue;
		else break;
	}
	if (i==n+1) 
		printf("%I64d
",tm[n]); else { int last=0; while(i<=n) { sum+=tm[i-1]-last; sum+=tm[i-1]-tm[i]; last=tm[i]; i++; for (;i<=n;i++) { if (tm[i]>=tm[i-1]) {continue;} else break; } } sum+=tm[i-1]-last; printf("%I64d
",sum); } return 0; }