题意
给定一个序列,每次操作可以把某个数+1-1。要求把序列变成非降数列。而且要求修改后的数列只能出现修改前的数。
思路
当前的数为xxx,之前的最大值为yyy,为了满足非降,我们要在[x,y][x,y][x,y]找到一个值zzz,让xxx和yyy变成zzz,无论zzz是什么,代价都为y−xy-xy−x,但选的更小更容易满足非降,所以我们改成xxx。
那么yyy改成xxx后,yyy之前有最大值z>yz>yz>y怎么办,其实不会对答案造成影响(。
代码
#include<queue>
#include<cstdio>
std::priority_queue<int> q;
int n;
long long ans;
int main(){
scanf("%d", &n);
int x;
for (; n; n--){
scanf("%d", &x);
q.push(x);
if(x < q.top()){
ans += q.top() - x;
q.pop();
q.push(x);
}
}
printf("%lld", ans);
}