思路

  • 要使得整个数组的和最小,则应将0元素 的值改变为
  • 所以首先遍历数组按上述原则改变,再遍历数组检查是否严格上升,最后遍历数组输出和。

代码实现

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; ++i)
    {
        cin >> arr[i];
    }
    for (int i = 0; i < n; ++i)
    {
        if (arr[i] == 0)
        {
            int left = (i == 0) ? 0 : arr[i - 1];
            arr[i] = left + 1;
        }
    }
    for (int i = 1; i < n; ++i)
    {
        if (arr[i] <= arr[i - 1])
        {
            cout << -1;
            return 0;
        }
    }
    int sum = 0;
    for (int i = 0; i < n; ++i)
    {
        sum += arr[i];
    }
    cout << sum;
    return 0;
}