2.5 KiB
2.5 KiB
解题思路
贪心思路
-
计算相邻元素差值:
- 对于数组
a,计算每对相邻元素的差值diff[i] = a[i+1] - a[i]。 - 如果
diff[i]为负数,意味着a[i+1]比a[i]小或相等,需要通过操作使a[i+1]变大。
- 对于数组
-
确定最小操作次数:
- 计算所有相邻元素中的最小差值
minDifference,即minDifference = min(diff[i])。 - 如果
minDifference为负数或零,则需要进行-minDifference + 1次操作,使得a[i+1]大于a[i],从而使数组严格递增。
- 计算所有相邻元素中的最小差值
-
实现细节:
- 遍历数组的每对相邻元素,找出最小的差值。
- 根据最小差值,计算出最少的操作次数。
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> arr(n); // 用于存储输入数组
vector<int> differences; // 用于存储相邻元素的差值
for(int i = 0; i < n; i++) {
cin >> arr[i];
if(i > 0) differences.push_back(arr[i] - arr[i - 1]);
}
int minDifference = INT_MAX;
// 寻找最小的差值
for(int diff : differences) {
if(diff < minDifference) {
minDifference = diff;
}
}
// 如果最小差值是负数或零,计算所需的操作次数
int minOperations = max(0, -minDifference + 1);
cout << minOperations << endl;
return 0;
}
关于 -minDifference + 1 为什么要 + 1 解释:
对于数组 a 中相邻的两个元素 a[i] 和 a[i+1],我们计算它们的差值 diff = a[i+1] - a[i]。
- 目标:要使
a[i] < a[i+1],需要diff > 0。 - 如果
diff < 0,说明a[i+1]比a[i]小,这时候a不是严格递增的。 - 如果
diff = 0,说明a[i+1]和a[i]相等,这时也不满足严格递增。
解释 -minDifference + 1
-
当
minDifference < 0时:- 假设
minDifference是所有相邻差值中的最小值,并且它是一个负数。 - 例如,
minDifference = -3,表示a[i+1] - a[i] = -3,也就是a[i+1]比a[i]小3。 - 要让
a[i+1] > a[i],我们至少需要使a[i+1] - a[i]从-3增加到1。因此需要增加4,即(-(-3)) + 1 = 3 + 1 = 4次操作。
- 假设
-
当
minDifference = 0时:minDifference等于0,表示a[i+1] - a[i] = 0,即a[i+1]和a[i]相等。- 为了使
a[i+1] > a[i],我们至少需要进行一次操作,使得a[i+1]大于a[i]。