分析:因为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