车辆排序 codeforces606C

车辆排序
CodeForces 606C
Description
一个无限长的铁路有一个载着n辆车的火车,每一辆车的编号从1到n。每一辆车的编号都是不同的。他们的顺序是无序的。


David Blaine想要将这些车按照他们的编号从小到大排序,他可以做两种操作。第一种,他可以将一辆车从任意位置移动到所有车的第一位。第二种,他可以将一辆车从任意位置移动到所有车的最后一位。


不过他很懒,所以他想知道将这些车排好序最少做几次操作就可以。      


Input
第一行输入包含一个整数n (1?≤?n?≤?100?000) -- 车的数目


第二行包含n个整数 pi (1?≤?pi?≤?n, pi?≠?pj if i?≠?j) - 车的编号的初始序列      


Output
输出一个整数 - 将车辆排好序的最小操作次数


Sample Input
5
4 1 2 5 3
 
4
4 1 3 2
 
Sample Output
2


2


Hint

在第一个样例中,将编号为4的车放到最后,然后把编号为5的车放到最后就可以了,总共是2次操作


#include <stdio.h>
#include <stdlib.h>
//给出一个序列, 任一个数可以放到序列末尾或者最前, 输出最小操作数
//hash一下每个数出现的位置, n减最长连续上升长度即为答案
//用另外一个数组储存最长序列长度,只要在输入得时候判断比它小一的元素是否在其左边
//是,则其下标为左边小一的元素下标加一,否,则为一
int main()
{
    int array[100001];
    int loc[100001];//存1到n每个数的位置
    int n;
    int len;//当前序列长度
    int max;//最长序列长度
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
          scanf("%d",&array[i]);
          loc[array[i]]=i;
        }
        max=0;
        len=1;
        for(int j=2;j<=n;j++){
          if(loc[j]>loc[j-1])
            len++;
          else{
            max=max>len?max:len;
            len=1;
          }
        }
        max=max>len?max:len;
        printf("%d\n\n",n-max);
    }

    return 0;
}


缓冲区的代码 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "stream.h" int quit; #define DELAY_MAX 5000 //最大延时5000毫秒 #define IN_NUM (2) #define MAIN_STREAM (0) #define SLAVE_STREAM (1) void Init_Interface(int Msg_id) { int qid; if(ApproDrvInit(Msg_id)) exit(1); if (func_get_mem(&qid)) { ApproDrvExit(); exit(1); } } void Clean_Interface(void) { ApproInterfaceExit(); } static int alarm_rec_enable; static unsigned int deltime; static unsigned int GetTimeStamp(void) { struct timeval timeval; gettimeofday(&timeval, NULL); return (timeval.tv_sec * 1000) + (timeval.tv_usec + 500) / 1000;; } void *get_frame(void *arg) { FILE *filefd=NULL; char filename[80]; int ch=0; stream_rpos_t rpos; frame_head_t frame_head; int first_frame_type=0; int first_frame=0; char *frame_pos; char *data; unsigned int cur_time; printf("get ch %d stream\n", ch); memset(&rpos, 0, sizeof(rpos)); st_stream_getStartPos(ch, MAIN_STREAM, &rpos); st_stream_getOneFrame(ch, MAIN_STREAM, 10, &rpos); while(!quit) { if(alarm_rec_enable) { if(st_stream_getOneFrame(ch, MAIN_STREAM, 200, &rpos) <= 0) { usleep(10*1000); continue; } frame_pos = &rpos.p_buf_data[rpos.data_start_pos]; memcpy(&frame_head,&rpos.p_buf_data[rpos.data_start_pos],sizeof(frame_head)); data=frame_pos+sizeof(frame_head_t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值