题目传送门
题解
- 解法一:
- 对于相邻的两个位置,假设高度分别为
,那么所需的操作数即为
。
- 对于这个结果,我们首先反应是:操作数
- 换种方式,我们可以认为是:无论右面
如何,当遇到
的时候,我们至少要保证
达到目的状态。那么对于
而言,如果
,那么在对
操作的时候,实际上就已经帮
完成了操作;如果
,那么此时再对
- 那么现在,我们就可以根据
和
- 详情见代码
- 解法二:
- 实际上解法一也是一种差分的思想,只不过是动态的差分。既然差分可以解决,那么我们当然可以直接计算差分数组,然后根据数组计算。
- 每次操作可以将一个区间内的数减一。
- 如图,通过计算出差分数组,操作可以转为先选 取一个数减一再选取一个数加一。目标的差分数 组也就变成了第一个数为1,其余为0的数组。
- 最快操作方式就是将差分数组第一个数减为1,其余减为0。即操作数为差分数组的正数之和减一
AC-Code
#include <bits/stdc++.h>
using namespace std;
int main() {
int t; cin >> t;
while (t--) {
int n; cin >> n;
int ans = 0;
int pre = 1;
int x;
for (int i = 1; i <= n; ++i) {
cin >> x;
if (x <= pre) {
pre = x;
continue;
}
ans += x - pre;
pre = x;
}
cout << ans << endl;
}
return 0;
}
#include<bits/stdc++.h>
#define
long long f[N],a[N];
int main() {
long long t;
cin >> t;
long long num = 0;
while(t--) {
long long n;
cin >> n;
num += n;
long long sum = 0;
for(long long i = 0; i < n; ++i) {
cin >> a[i];
if(i)
f[i] = a[i] - a[i - 1];
else
f[i] = a[i];
if(f[i] > 0)
sum += f[i];
}
cout << sum - 1 << endl;
}
}