51nod1294 修改数组

看题解的。。。就是将必须要修改的数去掉后求最长的不递减子序列。

upper_bound+lower_bound要理解。有时候-1有时候不用是有原因的。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
	int x=0;char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
	return x;
}
const int nmax=1e5+5;
const int inf=0x7f7f7f7f;
int dp[nmax],a[nmax];
int main(){
	int n=read(),u,v,d,cnt=0,ans=0;
	rep(i,1,n){
		u=read();
		if(u-i<0) ans++;else a[++cnt]=u-i;
	}
	fill(dp+1,dp+cnt+1,inf);
	rep(i,1,cnt){
		v=upper_bound(dp+1,dp+cnt+1,a[i])-dp;dp[v]=a[i];
	}
	printf("%d\n",ans+cnt-(lower_bound(dp+1,dp+cnt+1,inf)-dp-1));
	return 0;
}

  

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
时间: 2024-10-26 14:08:58

51nod1294 修改数组的相关文章

51nod 1294:修改数组

51nod 1294:修改数组 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1294 题目大意:将一个序列修改成严格递增序列,最少需要替换几个数. dp 这道题相当巧妙. 最小的满足条件的序列为$\{1,2,3,...,n\}$,若$a_i < i$那么该数必须被修改. 然后对序列$\{a_1-1,a_2-2,a_3-3,...,a_n-n\}$找出最长不递减子序列,除去该子序列外的数均要被修改. 复杂度$

Java修改数组长度

java中没有关于修改数组长度的api,在此本人提供了修改数组长度的两个函数:arrayAddLength()和arrayReduceLength().详细见代码. [java] view plaincopyprint? import java.lang.reflect.Array; /** * Description: This class is used to adjust array length. * @author e421083458 * */ public class ArrayT

面试题3(二):不修改数组找出重复的数字

// 面试题3(二):不修改数组找出重复的数字// 题目:在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至// 少有一个数字是重复的.请找出数组中任意一个重复的数字,但不能修改输入的// 数组.例如,如果输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},那么对应的// 输出是重复的数字2或者3. 解题思路: 不能修改数组,可以创建一个长度为n+1的辅助数组,空间复杂度为O(n). 如果用时间换空间的话,可以使用二分查找的思想. 元素范围为1~n,但是有n+1

微信小程序 修改数据,并动态渲染页面;修改数组;

一.修改数据,并在页面动态渲染 this.setData({ txt: '12112' }) 二.修改数组 var rotateClassItem = 'rotateClass['+ index + ']'; that.setData({ [rotateClassItem]: !that.data.rotateClass[index] }) 原文地址:https://www.cnblogs.com/siyecao2010/p/10083896.html

[题目2]不修改数组找出重复的数字

代码实现: package j2; /** * 不修改数组找出重复的数字 * Created by admin on 2019/5/14. */ public class FindDuplicate3 { public static void main(String[] args) { int arr[] = {2,3,5,4,3,2,6,7}; System.out.println(duplicate(arr,arr.length)); } public static int duplicat

不修改数组找出重复的数字(c语言)

让人瑟瑟发抖的面试题... 来我们看一下题目在一个 长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但不能修改输入的数组.注意:时间复杂度O(n),空间复杂度O(1) 找出数组中重复的数字(c语言)怎么解决勒???分析:利用题目中元素处于1~n的范围,把元素分为两组,判断两组元素个数,如果大于范围,则重复的数字就在这个范围内.例如:1~3范围中有4个数,说明其中至少有一个重复的数字.按此二分下去,将会剩下一个数字有两个,最后输出

一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)

数组中重复的数字 在上一篇博客中<剑指Offer>-- 题目一:找出数组中重复的数字(Python多种方法实现)中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素. 然后我们在博客用最复杂的方式学会数组(Python实现动态数组)这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组. 今天我们介绍一下另一道来自<剑指Offer>的关于数组的面试题--不修改数组找出重复的数字. 不修改数组找出重复的数字 题目二:不修改数组找出重复的数字 给定一个长度为 n+

0131 JavaScript数组中新增元素:修改数组索引、修改 length 长度、数组翻转

? 数组中可以通过以下方式在数组的末尾插入新元素: 数组[ 数组.length ] = 新数据; 1.5.1 通过修改 length 长度新增数组元素 可以通过修改 length 长度来实现数组扩容的目的 length 属性是可读写的 var arr = ['red', 'green', 'blue', 'pink']; arr.length = 7; console.log(arr); console.log(arr[4]); // undefined console.log(arr[5]);

迭代器对象numpy.nditer在数组上进行迭代——修改数组的值

nditer对象有另一个可选参数op_flags,默认情况下,nditer将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定op_flags=['readwrite']模式: np.nditer(a, op_flags=['readwrite']) 修改数组值的示例: import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print '原始数组是:' print a pri