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は何度も走って答えを得ます.
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;
}