码迷,mamicode.com
首页 > 编程语言 > 详细

51nod 1241 特殊的排序

时间:2018-09-05 23:54:30      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:png   gis   方法   lap   处理   puts   lis   ret   open   

技术分享图片

【题解】  

  设满足前后两个元素之差为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 特殊的排序

标签:png   gis   方法   lap   处理   puts   lis   ret   open   

原文地址:https://www.cnblogs.com/DriverLao/p/9594632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!