51Nod 1294 修改数组

Posted sineagle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod 1294 修改数组相关的知识,希望对你有一定的参考价值。

题目来源: HackerRank
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
技术分享图片 收藏
技术分享图片 关注
给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数。问最少需要修改几个数?
Input
第1行:一个数N表示序列的长度(1 <= N <= 100000)。
第2 - N + 1行:每行1个数,对应数组元素。(0 <= A[i] <= 10^9)
Output
输出最少需要修改几个数使得整个数组是严格递增的。
Input示例
5
1
2
2
3
4
Output示例
3
 1 //2018-07-16 17:15:29
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N = 1000005;
 8 
 9 int n;
10 int a[N], d[N], b[N], ans;
11 
12 int main(){
13     scanf("%d", &n);
14     int head = 0;
15     for(int i=1; i<=n; i++){
16         scanf("%d", &b[i]);
17         if(b[i]==0 && i==1) a[++head] = b[i]; //偷懒的地方 
18         if(b[i]-i >= 0) a[++head] = b[i]-i;
19         else ans++;
20     }
21     d[1] = a[1];
22     int len = 1;
23     for(int i=2; i<=head; i++){
24         if(a[i] >= d[len]) d[++len] = a[i];
25         else{
26             int j = upper_bound(d+1, d+len+1, a[i])-d;
27             d[j] = a[i]; 
28         }
29     }
30     printf("%d
", head-len+ans);
31     
32     return 0;
33 }

 

以上是关于51Nod 1294 修改数组的主要内容,如果未能解决你的问题,请参考以下文章

51nod1294 修改数组

51nod 1294 修改数组

1294 修改数组

51nod 1107(树状数组逆序数)

51nod-1732 婚姻介绍所(后缀数组)

51nod_1199 树的先跟遍历+区间更新树状数组