火车调度-c#求解-英雄会在线编程题目

题目:

火车调度

返回首页

  • 发布公司:
  • 有 效 期:
  • 赛 区:
  • CSDN
  • 2014-04-302015-04-30
  • 北京
  • 难 度 等 级:
  • 答 题 时 长:
  • 编程语言要求:
  • 120分钟
  • C C++ Java C#                
题目详情

火车从A地和B地之间运行,你知道火车从某地出发的时间和到达某地的时间(这个时间出发,一定这个时候到达)。火车到达目的地后,不能立刻返回,需要经过t分钟检修才可以返回。列车只在A、B两地运行。你知道每天内的时刻表,求A,B两地各需要存放多少辆列车,才能满足这个时刻表?即只要该出发的时候,就有车可以出发。

输入格式:

多组数据,每组数据第一行是一个整数t,表示列车到达目的地后需要检修t分钟才能再次出发。0<=t<=60。

第二行是两个整数na,nb。表示时刻表中每天从A开往B的列车数和从B开往A的列车数。0<=na,nb<=100。

接下来的na行,每行是两个时间,表示从A到B的列车出发和到达时间。

接下来nb行和na行的格式是一样的。

时间是MM:SS,即两位小时和两位分钟,保证出发时间小于到达时间,所有时间是在同一天内(从00:00到23:59)。

na行和nb行的时间并没有特殊的顺序。

输出格式:

对每组数据输出一行,包含两个空格分隔的整数,即A,B两个至少存放的列车数,才能维持时刻表正常运行。

                答题说明

输入样例

5

3 2

09:00 12:00

10:00 13:00

11:00 12:30

12:02 15:00

09:00 10:30

2

2 0

09:00 09:01

12:00 12:02

输出样例:

2 2

2 0

 

题目分析:

从给的案例可以看出,不考虑火车第二天的调度,比如说:火车只有从A到B地的,没有返回,第二天如何从A第发车的问题,所以问题就简单化了。

基本思路:

1、首先将发车时间转换成容易比较的数字,例如:9:00转换成9*60=540.

2、将时刻表按照发车数值大小排序。

3、使用两个集合保存当前车站可发火车情况,List<int> ahasTrain,bhasTrain,ahasTrain[i]表示多大数值后的时刻,这趟火车可以发车。

4、轮询一遍时刻表,如果是从a地发车,从集合ahasTrain中查找是否有满足条件的火车,如果没有,a地库存车辆+1,并将此车信息添加到bhasTrain集合中。如果有,那么这趟火车信息转存到集合bhasTrain中。

#region 首先排序
            for (int i = 0; i < n; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    if (dispatch[i, 0] > dispatch[j, 0])
                    {
                        int tmp = dispatch[i, 0];
                        dispatch[i, 0] = dispatch[j, 0];
                        dispatch[j, 0] = tmp;

                        tmp = dispatch[i, 1];
                        dispatch[i, 1] = dispatch[j, 1];
                        dispatch[j, 1] = tmp;

                        tmp = dispatch[i, 2];
                        dispatch[i, 2] = dispatch[j, 2];
                        dispatch[j, 2] = tmp;
                    }
                }
            }
            #endregion

            int acount = 0;
            int bcount = 0;
            List<int> astartTrain = new List<int>();
            List<int> bstartTrain = new List<int>();

            List<int> ahasTrain = new List<int>();
            List<int> bhasTrain = new List<int>();
            for (int i = 0; i < n; i++)
            {
                if (dispatch[2, i] == 1)
                {
                    #region a地发车时刻表
                    if (ahasTrain.Count > 0)
                    {
                        int index = 0;
                        bool exsit = false;
                        for (int j = 0; j < ahasTrain.Count; j++)
                        {
                            if (ahasTrain[j] <= dispatch[0, i])
                            {
                                exsit = true;
                                index = j;
                                bhasTrain.Add(dispatch[1, i] + t);
                                break;
                            }
                        }
                        if (exsit)
                        {
                            ahasTrain.RemoveAt(index);
                        }
                        else
                        {
                            astartTrain.Add(dispatch[0, i]);
                            bhasTrain.Add(dispatch[1, i] + t);
                        }
                    }
                    else
                    {
                        astartTrain.Add(dispatch[0, i]);
                        bhasTrain.Add(dispatch[1, i] + t);
                    }
                    #endregion
                }
                else
                {
                    #region b地发车时刻表
                    if (bhasTrain.Count > 0)
                    {
                        int index = 0;
                        bool exsit = false;
                        for (int j = 0; j < bhasTrain.Count; j++)
                        {
                            if (bhasTrain[j] <= dispatch[0, i])
                            {
                                exsit = true;
                                index = j;
                                ahasTrain.Add(dispatch[1, i] + t);
                                break;
                            }
                        }
                        if (exsit)
                        {
                            bhasTrain.RemoveAt(index);
                        }
                        else
                        {
                            bstartTrain.Add(dispatch[0, i]);
                            ahasTrain.Add(dispatch[1, i] + t);
                        }
                    }
                    else
                    {
                        bstartTrain.Add(dispatch[0, i]);
                        ahasTrain.Add(dispatch[1, i] + t);
                    }
                    #endregion
                }
            }
            
            acount = astartTrain.Count;
            bcount = bstartTrain.Count;


 

根据引用所提供的信息,我们需要找到一种方法来安排列车的出站顺序。在图中给出的例子中,列车的出站顺序为{8,4,2,5,3,9,1,6,7}。我们可以利用一个栈来模拟列车出站的过程。首先,我们将第一个列车进站,并将其从栈顶弹出。然后,我们检查栈顶元素是否等于当前的出站顺序中的下一个列车。如果是,则将其从栈顶弹出,并继续检查下一个列车。如果不是,则将当前的入站列车继续进站,并继续检查下一个列车。最后,如果栈为空且所有列车已经按照递减顺序出站,则调度成功。至少需要N条平行铁轨用于调度,其中N为入站列车的数量。在给出的例子中,至少需要9条平行铁轨用于调度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PTA 天梯赛 L2-014 列车调度](https://blog.csdn.net/qq_46039856/article/details/106190726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [L2-014. 列车调度](https://blog.csdn.net/qq_38628350/article/details/77984602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [L2-014 列车调度](https://blog.csdn.net/nahnah_/article/details/123464422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值