51nod 1241 特殊的排序
【题解】
设满足前后两个元素之差为1的最长上升子序列LIS的长度为m,那么本题的答案即为n-m.
证明:
1,n-m次移动一定可以让序列递增。设LIS的第一个数为i,最后一个数为j,我们按照i-1到1的递减的顺序把这些数调换到第一个位置,它们就排好序了。同理处理j+1到n. 总共需要n-m次移动。
2,不存在小于n-m次的移动方法。因为如果只需移动k次,k<n-m,那么剩下的n-k个数组成了一个更长的LIS(n-k>m),于LIS的长度为m矛盾。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define rg register 6 #define N 200010 7 using namespace std; 8 int n,m,ans,a[N],f[N]; 9 inline int read(){ 10 int k=0,f=1; char c=getchar(); 11 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 12 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 13 return k*f; 14 } 15 int main(){ 16 n=read(); 17 for(rg int i=1;i<=n;i++) a[i]=read(); 18 for(rg int i=1;i<=n;i++) f[a[i]]+=f[a[i]-1]+1,ans=max(ans,f[a[i]]); 19 // printf("%d\n",ans); 20 // for(rg int i=1;i<=n;i++) printf("%d ",f[a[i]]); puts(""); 21 printf("%d\n",n-ans); 22 return 0; 23 }