【HIHOCODER 1529】 不上升序列

描述

给定一个长度为 n 的非负整数序列 a[1..n]。
你每次可以花费 1 的代价给某个 a[i] 加1或者减1。
求最少需要多少代价能将这个序列变成一个不上升序列。

输入

第一行一个正整数 n。
接下来 n 行每行一个非负整数,第 i 行表示 a[i]。
1 ≤ n ≤ 500000
0 < a[i] ≤ 109

输出

一个非负整数,表示答案。

样例解释

[5,3,4,5] -> [5,4,4,4]

样例输入

4
5
3
4
5

样例输出

2

原题是CODEFORCES 713 div1 C题:
题链

#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 1000000000
using namespace std;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void Out(ll a){
    if(a<0) putchar('-'),a=-a;
    if(a>=10) Out(a/10);
    putchar(a%10+'0');
}
const int N=1000005;
char ch[N];
int main(){
    priority_queue<int,vector<int>,greater<int> >que;
    int n=read();
    ll ans=0;
    for(int i=0;i<n;i++){
        int x=read();que.push(x);
        if(que.top()<x){
            ans+=x-que.top();
            que.pop();que.push(x);
        }
    }
    Out(ans);
    return 0;
}
posted @ 2017-10-27 18:20  江南何采莲  阅读(269)  评论(0编辑  收藏  举报