【提醒自己】CodeForces
来源:互联网 发布:父母的神逻辑知乎 编辑:程序博客网 时间:2024/05/29 17:43
Problem Description
给你一个长度为n的数组,让你把它变成递增,或者递减,或者先增后减。问你最少需要加多少数
思路:
一开始写烂了,还以为自己的代码很对。后面发现没考虑好。
做法:
求出递增需要的最少,递减需要的最少。
然后再跑一边for求,先增后减的最少
#include<bits/stdc++.h>using namespace std;#define ll long long#define maxn 100055ll a[maxn], lb[maxn], rb[maxn];ll lsum[maxn], rsum[maxn];int main(){ int n, i; while(~scanf("%d", &n)) { for(i = 0; i < n; i++) scanf("%lld", &a[i]); memcpy(lb, a, sizeof(a)); memset(lsum, 0, sizeof(lsum)); memset(rsum, 0, sizeof(rsum)); for(i = 1; i < n; i++)//递增 { if(lb[i] <= lb[i-1]) { lsum[i] = lsum[i-1] + lb[i-1] - lb[i] + 1; lb[i] = lb[i-1] + 1;//记录前缀和 } else lsum[i] = lsum[i-1]; } memcpy(rb, a, sizeof(a)); for(i = n - 1; i >= 1; i--)//递减 { if(rb[i-1] <= rb[i]) { rsum[i-1] = rsum[i] + rb[i] - rb[i-1] + 1; rb[i-1] = rb[i] + 1;//记录后缀和 } else rsum[i-1] = rsum[i]; } ll ans = min(lsum[n-1], rsum[0]); // printf("%lld\n", ans); for(i = 1; i < n - 1; i++) { //例如4 4 5 不能变成4 5 5, 得变成4 6 5 ll c1 = (lb[i] == rb[i+1])?1:0;//核心点,容易漏掉的地方 ll c2 = (rb[i] == lb[i-1])?1:0; ans = min(ans, lsum[i] + rsum[i+1] + c1); ans = min(ans, lsum[i-1] + rsum[i] + c2); } printf("%lld\n", ans); }}
阅读全文
0 0
- 【提醒自己】CodeForces
- 提醒自己
- 提醒自己
- 提醒自己
- 提醒自己
- 提醒自己
- 提醒自己
- 提醒自己
- 提醒下自己
- 异常--提醒自己
- 提醒自己要专注~
- 给自己的提醒
- 提醒下自己
- 时刻提醒自己的话
- 提醒一下自己
- 时刻提醒自己
- 用于提醒自己
- 提醒自己: 别陷太深
- Udacity CS101 笔记
- 关于ANR异常捕获与分析,你所需要知道的一切
- 【Scikit-Learn 中文文档】线性和二次判别分析
- mysql关于null值的使用
- hibernate_day04_12_HQL多表查询介绍
- 【提醒自己】CodeForces
- 集合collection
- python3学习-lxml模块
- Convert a List to a Comma-Separated String in Java 8
- laserscan数据格式
- 关于MySQL中的information_schema
- 1045. 快速排序(25)--Python
- Java学习13 GUI程序设计(Swing)
- uC/OS-II中OSUnMapTbl数组的推导