zoukankan      html  css  js  c++  java
  • 天梯赛 L2-014 列车调度 (模拟)

    火车站的列车调度铁轨的结构如下图所示。

    Figure

    两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?

    输入格式:

    输入第一行给出一个整数N (2 <= N <= 105),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。

    输出格式:

    在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。

    输入样例:

    9
    8 4 2 5 3 9 1 6 7
    

    输出样例:

    4
    

    分析:

    用一个数组保存每条铁轨中的最小值,如果新加入的一个值比当前铁轨中的任何一个都大的话,也就意味着我们不能够把这个数加入到已有的铁轨中,需要新加一条铁轨来保存这个值,这也就是说明这个数组是递增的。如果新加入的值不比最后一个已有的大,我们就要在数组中找到第一个比它大的,然后把它替换了。

    代码:

        #include<stdio.h>
        #include<iostream>
        #include<string.h>
        #include<string>
        #include<algorithm>
        #include<math.h>
        #include<map>
        #include<set>
        #include<vector>
        using namespace std;
        int main()
        {	 
            int N;
            int a[100009];//a数组中保存的就是每个平行轨道中的最小值,而且a本身是一个递增的数组 
            scanf("%d",&N);
            int k=1,b,i;
            a[0]=-1;
            while(N--)
            {  	 
            	scanf("%d",&b);
            	 if(b>a[k-1])
        		 a[k++]=b;//因为数组递增,要是比当前数组中的最后一个还要大的话,就肯定要新加一条轨道了 
        		 else
        		 	for( i=0;i<k;i++)
            		if(b<a[i])//在前面已有的里面找到第一个比b大的,肯定就是最合适的插入位置 
            		  {  			
            			a[i]=b; 
            			break; 
            		  }  		
            }
            printf("%d
    ",k-1);
        	return 0;
        } 
    
    

    上面的是正确的代码,然后下面的超时,然而实在看不出来为什么超了。

        #include<stdio.h>
        #include<iostream>
        #include<string.h>
        #include<string>
        #include<algorithm>
        #include<math.h>
        #include<map>
        #include<set>
        #include<vector>
        using namespace std;
        int main()
        {	 
            int N;
            int a[100009];
            scanf("%d",&N);
            int k=0,b,i;
            scanf("%d",&b);
            a[k++]=b;
            N--;
            while(N--)
            {  	 
            	scanf("%d",&b);
            	 if(b>a[k-1])
        		 a[k++]=b;
        		 else
        		 	for( i=0;i<k;i++)
            		if(b<a[i])
            		  {  			
            			a[i]=b; 
            			break; 
            		  }  		
            }
            printf("%d
    ",k);
        	return 0;
        } 
    

    但是如果把 a[k++]=b; 换成a[k]=b;k++;就对了,很魔性。

  • 相关阅读:
    CI框架用cookie实现用户自动登录
    php预定义常量
    ubuntu root密码
    jQuery的form中ajaxSubmit参数
    优酷视屏播放去广告链接id_XXX.html内容替换红色
    linux 重启apache:apachectl -k graceful
    python深copy与浅copy的区别
    python3中pathlib库的Path类方法汇总
    unittest使用discover加载不同目录下的case失败,提示Path must be within the project
    自定义HTMLTestRunner报告case名称
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6729684.html
Copyright © 2011-2022 走看看