首页 > 代码库 > 51nod1294 修改数组

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示例
512234
Output示例
3

51nod1294 修改数组