首页 > 代码库 > 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 修改数组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。