题目:
火车从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;