芳芳的不下降序列

Problem Description

芳芳特喜欢数列,有一天,芳芳发现了这样一个问题,给一个n个数的序列,可以进行这样一次操作,对区间[L,R]上的数字集体+1(1<=L<=R<=n),最少操作多少次,使得整个序列变为单调不下降序列。
如 3 2 1 -> 3 3 2 -> 3 3 3最少2次操作。
无所不能的芳芳觉得太简单了,你能解决吗?
Input

多组数据。输入一个n,接下来有n个数字。(1<=n<=10000,这些数字不会超int)
Output

每组输出一个数字,最小的操作数。
Example Input

3
1 2 3
3
3 2 1
4
7 4 1 47
Example Output

0
2
6

想法:
这个题拿到后的想法就是在想是不是贪心什么的,想了半天在想是不是每次让加一的范围最大才能保证总和最少,想来想去一直拿不出方案。最后看了眼别人的解法,直接从后往前计算了,先让每一个降序数等于前一个数这是保证后面的是不下降数列,循环结束也就是最小的次数。

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int arr[10002];
int main(void) {
    int n;
    while (cin >> n) {
        memset(arr, 0, sizeof(arr));
        for (int i = 0; i < n; i++)
            cin >> arr[i];
        int sum = 0;
        for (int i = n - 1; i > 0; i--) {
            if (arr[i] < arr[i - 1]) {
                sum += arr[i - 1] - arr[i];
            }
        }
        cout << sum << endl;
    }
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值