关于一个汽车调度的排车问题
来园子很多年了,一直都是看别人写文章,也在园子里学到不少的东西。废话就不多说了,直接上内容。
公司最近在做一个车辆租赁的项目,其中有个预排的功能,要求如下:
为了描述方便,我把时间用数字来表示
假如A型号的车在时间段10开始20结束,有甲客户订了,在另一时间段30-40有乙客户订了,因为时间不相交,所以只需要1辆就可以满足这两个客户的要求。如果又来一个丙客户在时间段10-40,订同样型号的车,因为时间段跟前面那辆车的时间相交,所以需要另一台A型号的车才能满足要求。现在问题是希望从数据库中读取所有的A型号车下单的客户开始和结束时间,通过程序判断至少需要几辆车才能满足客户的要求?
我的思路是
1、首先按订车的开始时间从小到大放入集合中进行排序。
2、将第1个项从集合中删除,需要的车辆数加1(默认初始化为0)
3、第1项的结束时间跟剩下的集合开始时间依次从小到大进行比较,如果碰到比第1项结束时间要大的,删除该项,将该项结束时间跟剩下的
集合开始时间比较,依次类推,直到集合结尾。
4、将需要的车辆数加1,重新从集合第一个元素依照上面的步骤,依次循环,直到集合中没有任何元素为止。
下面给出Linq的实现代码
class TestDate { public int Index { get; set; } //唯一标识 public int Start { get; set; } //开始时间 public int End { get; set; } //结束时间 } class Program { static void Main(string[] args) { int Count = 0; List<TestDate> TestList = new List<TestDate>(); TestList.Add(new TestDate { Index = 0, Start = 10, End = 20 }); TestList.Add(new TestDate { Index = 1, Start = 30, End = 40 }); TestList.Add(new TestDate { Index = 2, Start = 50, End = 60 }); TestList.Add(new TestDate { Index = 3, Start = 30, End = 80 }); var Temp1=TestList.OrderBy(s => s.Start); TestDate t; while (TestList.Count > 0) { Count++; t = Temp1.FirstOrDefault(); TestList.Remove(t); while (t != null) { t = TestList.FirstOrDefault(s => t.End < s.Start); TestList.Remove(t); } } Console.Write("需要车辆总数为:"+Count); Console.Read(); } }
这是后来重新用DataTable实现的
class Program { static void Main(string[] args) { int Count = 0;//定义需要车辆总数 //填充表 DataTable dt = new DataTable("Table_AX"); dt.Columns.Add("start", System.Type.GetType("System.Int32")); dt.Columns.Add("end", System.Type.GetType("System.Int32")); DataRow dr = dt.NewRow(); dr["start"] = 10; dr["end"] = 20; dt.Rows.Add(dr.ItemArray); dr["start"] = 30; dr["end"] = 40; dt.Rows.Add(dr.ItemArray); dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray); dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray); dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray); dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray); //按开始时间升序排 dt.DefaultView.Sort = "start asc"; dt.DefaultView.ToString(); while(dt.Rows.Count>0) { Count++; int endTemp = Convert.ToInt32(dt.Rows[0]["end"]); dt.Rows.RemoveAt(0); int m = dt.Rows.Count; int k = 0; while(m>k) { if (Convert.ToInt32(dt.Rows[k][0]) > endTemp) { endTemp = Convert.ToInt32(dt.Rows[k][1]); dt.Rows.RemoveAt(k); m--; } else k++; } } Console.Write(Count); Console.Read(); }