hihoCoder挑战赛29

多打打不同的比赛,找经验啊

题目4 : 不上升序列

时间限制:40000ms
单点时限:2000ms
内存限制:256MB

描述

给定一个长度为 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


hiho的代码
#include <bits/stdc++.h>
using namespace std;
long long c,n,k;
priority_queue<int,vector<int>, greater<int>  >a;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>c;
        a.push(c);
        if(a.top()<c){
        k+=c-a.top();
        a.pop();
        a.push(c);
        }
    }
    cout<<k;
    return 0;
}

变成相反数,不用重载写起来舒服的

#include <bits/stdc++.h>
using namespace std;
long long c,n,k;
priority_queue<int>a;
int main()
{
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>c;
        c=-c,a.push(c);
        if(a.top()>c)k+=a.top()-c,a.pop(),a.push(c);
    }
    cout<<k;
    return 0;
}

大佬们都讲是原题,找了下这个题

time limit per test
1 second
memory limit per test
64 megabytes
input
standard input
output
standard output

Little Petya likes to play very much. And most of all he likes to play the following game:

He is given a sequence of N integer numbers. At each step it is allowed to increase the value of any number by 1 or to decrease it by 1. The goal of the game is to make the sequence non-decreasing with the smallest number of steps. Petya is not good at math, so he asks for your help.

The sequence a is called non-decreasing if a1 ≤ a2 ≤ ... ≤ aN holds, where N is the length of the sequence.

Input

The first line of the input contains single integer N (1 ≤ N ≤ 5000) — the length of the initial sequence. The following N lines contain one integer each — elements of the sequence. These numbers do not exceed 109 by absolute value.

Output

Output one integer — minimum number of steps required to achieve the goal.

Examples
input
5
3 2 -1 2 11
output
4
input
5
2 1 1 1 1
output
1
CF的这道题代码如下
#include <bits/stdc++.h>
using namespace std;
long long c,n,k;
priority_queue<int>a;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>c;
        a.push(c);
        if(a.top()>c){
        k+=a.top()-c;
        a.pop();
        a.push(c);
        }
    }
    cout<<k;
    return 0;
}

 

转载于:https://www.cnblogs.com/BobHuang/p/7077984.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值