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;
}