51nod 1241:特殊的排序

51nod 1241:特殊的排序

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1241

题目大意:给出$n$个数($1 \leqslant a_i \leqslant n$),现在要对这个数组进行排序,在排序时只能将元素放在数组的头部或尾部,问至少需要移动多少个数字,才能完成整个排序过程?

DP

显然最少操作数等于$n-|$最长连续子序列$|$.

故定义状态:$dp[i]$表示以$i$结尾的连续子序列长度.

转移方程:$dp[i]=dp[i-1]+1$.

代码如下:

 1 #include <iostream>
 2 #define N 50005
 3 using namespace std;
 4 int n,t,dp[N],ans;
 5 int main(void){
 6     std::ios::sync_with_stdio(false);
 7     cin>>n;
 8     for(int i=0;i<n;++i){
 9         cin>>t;
10         dp[t]=dp[t-1]+1;
11         ans=max(ans,dp[t]);
12     }
13     cout<<n-ans;
14 }
时间: 2024-11-03 21:45:39

51nod 1241:特殊的排序的相关文章

51nod 1241 特殊的排序(动态规划)

分析:记数组中最长的连续子串长度为maxlen(数值上连续,位置不一定连续,如2134,最长为3).首先可以证明,n-maxlen次操作可以满足条件,如最长子串最后一个为x<n,则把x+1移到最后,如果是x=n,记子串的第一个为y,把y-1移到最前,每次操作后最长连续子串长度+1,故可以满足条件.接下来证明,这是最少的移动次数.假设还有更少的,说明存在一步移动,最长连续子串长度至少+2,但移走一个元素不增加长度,把这个元素放在最前或最后最多只能增加1,矛盾. 求maxlen动态规划一下,记dp[

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>

1241 特殊的排序

1241 特殊的排序 题目来源: 摩根斯坦利的比赛题 基准时间限制:1 秒 空间限制:131072 KB 一个数组的元素为1至N的整数,现在要对这个数组进行排序,在排序时只能将元素放在数组的头部或尾部,问至少需要移动多少个数字,才能完成整个排序过程? 例如: 2 5 3 4 1 将1移到头部 => 1 2 5 3 4 将5移到尾部 => 1 2 3 4 5 这样就排好了,移动了2个元素. 给出一个1-N的排列,输出完成排序所需的最少移动次数. Input 第1行:1个数N(2 <= N 

51nod 1090 3个数和为0(排序+二分)

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 首先将序列进行排序,然后根据a+b+c=0,c=-a-b,二分查找c,注意判重,即c>b. 时间复杂度O(n*n*logn). #include<bits/stdc++.h> using namespace std; int n,a[1005]; int find(int x) { int l=0,r=n-1; while(l<=r) { int

51nod 1278 相离的圆(排序+修改步长)

题目意思: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} {2, 3} {2, 4} {3, 4}这5对都有交点,只有{1, 4}是相离的. Input 第1行:一个数N,表示圆的数量(1 <= N <= 50

51nod 1018排序

给出N个整数,对着N个整数进行排序 Input 第1行:整数的数量N(1 <= N <= 50000) 第2 - N + 1行:待排序的整数(-10^9 <= A[i] <= 10^9) Output 共n行,按照递增序输出排序好的数据. Input示例 5 5 4 3 2 1 Output示例 1 2 3 4 5 从大到小排序 1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[50050]; 4 int

51nod 1095 Anigram单词【hash/map/排序/字典树】

1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram.现在给定一个字典,输入Q个单词,从给出的字典中找出这些单词的Anigram. Input 第1行:1个数N,表示字典中单词的数量.(1 <= N <= 10000) 第2 - N + 1行,字典中的单词,单词长度 <= 10

51nod 1589 移数博弈【桶排序+链表】

1589 移数博弈 基准时间限制:1 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 小A和小B在玩一个游戏. 他们拥有一个数列. 小A在该数列中选择出最大的那个数,然后移出该数列. 小B在剩下的数列中选择出最大的那个数,并乘上小A的那个值,作为他的答案. 那么现在问题来了. 他们现在想换一种玩法,把该数列长度大于等于2的区间(即n*(n-1)/2个区间)单独作为一个数列拿出来,然后做一次上述的游戏,然后计算出小B所有的答案,考虑到输出那么多数比较困难,因此他们想知道所有答案和

51NOD 1278 相离的圆(二分 + 排序)

传送门 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} {2, 3} {2, 4} {3, 4}这5对都有交点,只有{1, 4}是相离的. Input 第1行:一个数N,表示圆的数量(1 <= N <= 50000) 第2 - N + 1行:每行2个数P, R中间用空格分隔,P表示圆心的位置,R表示圆的半径(1 <= P, R <=