hdoj5256序列变换【LIS】

来源:互联网 发布:药店销售软件 编辑:程序博客网 时间:2024/05/10 02:20

序列变换

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 894    Accepted Submission(s): 355


Problem Description
我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。
请输出最少需要修改多少个元素。
 

Input
第一行输入一个,表示有多少组数据

每一组数据:

第一行输入一个,表示数列的长度

第二行输入N个数。

每一个数列中的元素都是正整数而且不超过。
 

Output
对于每组数据,先输出一行

Case #i:

然后输出最少需要修改多少个元素。
 

Sample Input
221 1032 5 4
 

Sample Output
Case #1:0Case #2:1
 


 

#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;const int MAX=100010;int la[MAX];int lb[MAX];int lis(int n){    int i,j;    lb[1]=la[1];int len=1;    for(i=2;i<=n;++i){        int left=1,right=len,flag=0;        if(la[i]>=lb[len]){            len++;lb[len]=la[i];            continue;        }        while(left<=right){            int mid=(left+right)>>1;            if(la[i]>=lb[mid]){                left=mid+1;            }            else {                right=mid-1;            }        }        lb[left]=la[i];    }    return len;}int main(){    int t,n,i,j,k=1;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        for(i=1;i<=n;++i){            scanf("%d",&la[i]);           la[i]-=i;        }        int m=lis(n);        printf("Case #%d:\n%d\n",k++,n-m);    }    return 0;}
0 0
原创粉丝点击