# 解题思路

贪心思路

  • 计算相邻元素差值

    • 对于数组 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;
}
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

关于 -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

  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 次操作。
  2. 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]
上次更新:: 3/4/2025, 5:49:45 PM
@2021-2025 代码随想录 版权所有 粤ICP备19156078号