序列变换
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1233 Accepted Submission(s): 460
Problem Description
我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。
请输出最少需要修改多少个元素。
请输出最少需要修改多少个元素。
Input
第一行输入一个
T(1≤T≤10)
,表示有多少组数据
每一组数据:
第一行输入一个 N(1≤N≤105) ,表示数列的长度
第二行输入N个数 A1,A2,...,An 。
每一个数列中的元素都是正整数而且不超过 106 。
每一组数据:
第一行输入一个 N(1≤N≤105) ,表示数列的长度
第二行输入N个数 A1,A2,...,An 。
每一个数列中的元素都是正整数而且不超过 106 。
Output
对于每组数据,先输出一行
Case #i:
然后输出最少需要修改多少个元素。
Case #i:
然后输出最少需要修改多少个元素。
Sample Input
2 2 1 10 3 2 5 4
Sample Output
Case #1: 0 Case #2:1
刚做的时候,先求了数组的最长上升子序列,然后用n减去最长递增的长度,然后果断超时了
又用了二分做,错了
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #define INF 0x3f3f3f using namespace std; int a[100010]; int main(){ int i,j,k,t,n,top,l,r,mid,ll=1; scanf("%d",&t); while(t--){ memset(a,0,sizeof(a)); scanf("%d",&n); top=0; a[0]=-INF; for(i=1;i<=n;i++){ scanf("%d",&k); k-=i; if(k>=a[top]){ a[++top]=k; } else{ l=1; r=top; while(l<=r){ mid=(l+r)/2; if(k>=a[mid]) l=mid+1; else r=mid-1; } a[l]=k; } } printf("Case #%d:\n%d\n",ll++,n-top); } return 0; }