zoukankan      html  css  js  c++  java
  • Trains 归纳法

    【问题描述】
    山山非常喜欢他的玩具火车。这列玩具火车总共有 n 节车厢,他给火车的每一节车厢
    按照 从车头到车尾的顺序标上了序号 1 ~ n。
    山山家来了一个幼儿园的小朋友岳岳。岳岳非常调皮,他把山山的玩具火车拆了又拼,
    拼了又拆。岳岳走之后,山山发现他的玩具火车的车厢顺序被完全弄乱了,不过他不担心,
    因为他已经给车厢按顺序标过号了。山山想把自己的火车给拼回原来的样子,但是因为一些
    原因,他想调整尽量少的车厢,并且遵循以下两种操作方式:
    1. 将某节车厢拆下来,拼接到车头;
    2. 将某节车厢拆下来,拼接到车尾。
    注意, 当某节车厢被拆下来后,山山会将它两边的车厢拼在一起,使得这些车厢始终
    是一列完整的火车。
    由于山山还只是一名小学生,他的计算能力不是很强,于是他希望你能帮他算出最少需
    要调整几次车厢就能把玩具火车恢复原状。


    【输入格式】
    输入文件名为 train.in。
    第一行为一个正整数 n。
    第二行为 n 个整数,表示被弄乱后的火车从车头到车尾每一节车厢上的标号,保证其为一
    个 1 ~ n 的排列。


    【输出格式】
    输出文件名为 train.out。
    输出仅一行一个整数 ans 表示答案。


    【样例输入与输出】
    train.in
    5
    4 1 2 5 3
    train.out
    2


    【数据范围】
    对于 20%的数据:0 < n <= 100
    对于另外 20%的数据:0 < n <= 200000,保证数列单调不上升
    对于 100%的数据:0 < n <= 200000


    在这道题中,我们可以把火车移到前面或后面,目标都是保证最后的升序,而且当前怎么移对其他火车的位置是没有影响的。

    所以我们直接统计最长连续上升子序列,n减去这个子序列就是答案。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    
    #define ll long long
    #define il inline
    #define db double
    
    #define max(a,b) ((a)>(b)?(a):(b))
    
    using namespace std;
    
    int f[200045];
    
    int main()
    {
    	freopen("train.in","r",stdin);
    	freopen("train.out","w",stdout);
    	
    	int n;
    	cin>>n;
    
    	int ans=0;
    
    	int x;
    	for(int i=1;i<=n;i++)
    		{
    			scanf("%d",&x);
    			f[x]=f[x-1]+1;
    			ans=max(ans,f[x]);
    		}
    
    	printf("%d
    ",n-ans);
    
    	return 0;
    }
    
  • 相关阅读:
    使用hadoop平台进行小型网站日志分析
    flume分布式日志收集系统操作
    map-reduce任务的执行流程
    linux设置定制器自动执行任务
    pig笔记
    hive操作记录
    hbase集群安装和shell操作
    Spark Streaming揭秘 Day24 Transformation和action图解
    Spark Streaming揭秘 Day23 启动关闭源码图解
    Spark Streaming揭秘 Day22 架构源码图解
  • 原文地址:https://www.cnblogs.com/gshdyjz/p/7681916.html
Copyright © 2011-2022 走看看