//输入5 //输入1 4 3 2 5 //输出6 //把数组通过增加数字变成先递增后递减或者递增或者递减 #include <iostream> #include <algorithm> #include <vector> using namespace std; int main(){ int n; cin >> n; vector<int> arr(n); vector<int> dp(n, 0); for(int i=0; i<n; i++) cin >> arr[i]; int pre = arr[0]; for(int i=1; i<n; i++) { // 把数组从 0 到 i 加成递增需要的数量 dp[i] = dp[i-1] + max(0, pre - arr[i] + 1); pre = max(pre + 1, arr[i]); } int res = dp.back(), cur = 0; pre = arr.back(); for(int i=n-2; i>=0; i--){ // 重复加 的部分 //比较变成递增和变成递减需要增加的数字哪个小 int repeat = min(dp[i] - (i==0 ? 0 : dp[i-1]) , max(0, pre - arr[i] + 1)); // 把数组从 i 到 n-1 加成递减需要的数量 cur += max(0, pre - arr[i] + 1); pre = max(pre + 1, arr[i]); // dp[i] + cur - repeat 这个值为把第 i 个元素变成最大的元素,往左递减,往右递减,需要花费的最小代价 // 算出每一个情况,取最小 res = min(dp[i] + cur - repeat, res); } cout << res << endl; system("pause"); return 0; }