【51 nod 1294】 修改数组

来源:互联网 发布:淘宝网被冻结 编辑:程序博客网 时间:2024/05/15 23:44

Description

给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数。问最少需要修改几个数?

Solution

对于一个数a[i],显然当它小于i时他肯定是要修改的,那么当有两个数a[u],a[v],且(u>v>i,a[u]>a[v]>a[i]),那么现在选哪一个呢?我们考虑取一个和i之间能容纳尽量多数并且尽量近的数,所以我们就比较a[u]-u,a[v]-v的大小,选一个尽量小的即可。

这样算法就很显然了,用LIS跑一下最长不下降子序列即可。

Code

#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int maxn=1e5+5;int f[maxn],a[maxn];int n,i,t,j,k,l,r,mid,num;int main(){    //freopen("data.in","r",stdin);    scanf("%d",&n);    for (i=1;i<=n;i++){        scanf("%d",&a[i]);a[i]-=i;        if (a[i]<0) continue;        if (a[f[num]]<=a[i] || !num) f[++num]=i;        else{            l=1;            r=num;            while (l<r){                mid=(l+r)/2;                if (a[f[mid]]<=a[i]) l=mid+1;                else r=mid;            }            f[l]=i;        }    }    t=n-num;    printf("%d\n",t);}
0 0
原创粉丝点击