zoukankan      html  css  js  c++  java
  • 关于一个汽车调度的排车问题

    来园子很多年了,一直都是看别人写文章,也在园子里学到不少的东西。废话就不多说了,直接上内容。

    公司最近在做一个车辆租赁的项目,其中有个预排的功能,要求如下:

    为了描述方便,我把时间用数字来表示

    假如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();
    }
    
  • 相关阅读:
    SecureCRT使用提示
    毕业论文写作时,那些页眉、页脚中的内容中的横线、回车符难删除问题解决
    ostu进行遥感图像的分割
    有关奇葩的mex编程时的matlab出现栈内存错误的问题
    free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因
    matlab坐标轴设置
    Use PRODUCT_USER_PROFILE To Limit User
    mysql只导出表结构或数据
    编程学习要讲究效率和经验
    Unity3D的SerializeField 序列化域名
  • 原文地址:https://www.cnblogs.com/zly2000a/p/2271303.html
Copyright © 2011-2022 走看看