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 修改数组的主要内容,如果未能解决你的问题,请参考以下文章