分析:因为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<algorithm>
using namespace std;
int a[100005];
int f[100005];
int get_len(int n)
{
int len,i,pos;
len=1;
f[1]=a[1];
for(i=2;i<=n;i++)
if(a[i]>=f[len])
f[++len]=a[i];
else //upper_bound返回的是序列中严格大于key值的第一个数
{
pos=upper_bound(f+1,f+len+1,a[i])-f;
f[pos]=a[i];
}
return len;
}
int main()
{
int T,t,n,i;
scanf("%d",&T);
t=0;
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]-=i;
}
printf("Case #%d:\n",++t);
printf("%d\n",n-get_len(n));
}
return 0;
}
原文地址:http://blog.csdn.net/a809146548/article/details/46336299