//输入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; }
点赞 评论

相关推荐

06-26 17:24
已编辑
宁波大学 golang
迷失西雅图:别给,纯kpi,别问我为什么知道
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
约会议室面试被+1发现了
积极的悲伤蛙愿off...:这怎么了,我都直接跟带教说投了哪些公司让他帮我看看简历,本来就是阶段性的实习生,别真把自己当正式工了
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务