1. 程式人生 > >51nod 1241 特殊的排序

51nod 1241 特殊的排序

getchar long play lap display 排序 http printf 答案

技術分享圖片

【題解】  

  設滿足前後兩個元素之差為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 }
View Code

51nod 1241 特殊的排序