• 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 <= 50000)。
    第2 - N + 1行:每行1个数,对应排列中的元素。
    Output
    输出1个数,对应所需的最少移动次数。
    Input示例
    5
    2
    5
    3
    4
    1
    Output示例
    2
    思路:就是找最长的符合原来的排列的长度,比如25341,符合的最长的为2 3 4,然后总长度减下就是需要移动的,那么问题就是则么去找这个序列,就是相差一的,因为要连续,所以看下比当前这个数小一的是否在前面在的话就是前一个输得长度加一。
    复杂度O(n);
     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <stdlib.h>
     4 #include <string.h>
     5 #include <iostream>
     6 #include <math.h>
     7 #include <queue>
     8 #include <set>
     9 #include <map>
    10 using namespace std;
    11 typedef long long LL;
    12 const LL mod = 1e9+7;
    13 int ans[60000];
    14 int id[60000];
    15 int t[60000];
    16 int main(void)
    17 {
    18         int n;
    19         int i,j;scanf("%d",&n);
    20         for(i = 1; i <= n; i++)
    21         {
    22                 scanf("%d",&ans[i]);
    23                 id[ans[i]] = i;
    24         }
    25         int maxx = 1;
    26         fill(t,t+60000,1);
    27         for(i = 2; i <= n; i ++)
    28         {
    29                 if(id[i-1] < id[i])
    30                 {
    31                      t[id[i]] = t[id[i-1]]+1;
    32                      maxx = max(t[id[i]],maxx);
    33                 }
    34         }
    35         printf("%d
    ",n-maxx);
    36         return 0;
    37 }
    
    
    油!油!you@
  • 相关阅读:
    敏捷冲刺二
    敏捷冲刺一
    软工网络15-Alpha阶段敏捷冲刺
    Scrum 冲刺博客
    软工网络15团队作业3——需求分析与设计
    软工网络15团队作业2——团队计划
    软件网络15团队作业1
    【Alpha阶段】第一次Scrum Meeting
    Scrum 冲刺博客集合
    第 1 篇 Scrum 冲刺博客
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5857832.html
Copyright © 2020-2023  润新知