hdu5256序列严格递增

来源:互联网 发布:用友u8安装数据库 编辑:程序博客网 时间:2024/05/23 21:37

题意:一个数列,a1,a2,a3,a4,---,an,需要最少修改多少个元素,使得这个序列严格递增?

a[i]-i 非递减序列 因为a[i]<a[i+1],且a[i],a[i+1]都是整数,所以有a[i+1]-1>=a[i],整理得a[i+1]-(i+1)>=a[i]-i。令b[i]=a[i]-i。则可以求出b[i]的最长不下降子序列的长度len,最后用n-len即为需要改变的最少的元素个数。

#include <iostream>#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int N=1000005; int T,n,m; int a[N]; int b[N]; int cas=1; int solve(int n){    int len=1;    b[0]=a[0];    for(int i=1;i<n;i++){       if(a[i]>=b[len-1]) b[len++]=a[i];       else{          int pos=upper_bound(b,b+len,a[i])-b;          b[pos]=a[i];       }    }    return len; }int main(){#ifndef  ONLINE_JUDGE   freopen("aaa","r",stdin);#endif  scanf("%d",&T);  while(T--){      scanf("%d",&n);      for(int i=0;i<n;i++) scanf("%d",&a[i]);      for(int i=0;i<n;i++) a[i]-=i;      printf("Case #%d:\n%d\n",cas++,n-solve(n));  }    return 0;}


0 0
原创粉丝点击