夜过吊桥算法

问题描述:五个人打算过一座吊桥,开始时他们都位于该桥的一侧。天很黑,五个人手里只有一个手电筒。该桥一次最多只能同时过两个人,无论是一个人还是两个人过桥,都需要携带手电筒看路。而且手电筒只能通过人携带过桥的方式传递。第一个人过桥需要1分钟时间,第二个人过桥需要2分钟,第三个人需要5分钟,第四个需要7分钟,第五个需要10分钟。由于速度不同,两个人一起过桥的话,速度以慢的人为准。求最快过桥时间。

Main

using System;
using System.Collections.Generic;
using System.Linq;

namespace PassRiver
{
    class Program
    {
        private const int maxPassTogetherCount = 2;
        static void Main(string[] args)
        {
            List<Person> leftPersons = new List<Person>();
            List<Person> rightPersons = new List<Person>();
            Person p1 = new Person(1);
            Person p2 = new Person(2);
            Person p3 = new Person(5);
            Person p4 = new Person(7);
            Person p5 = new Person(10);

            leftPersons.Add(p4);
            leftPersons.Add(p5);
            leftPersons.Add(p1);
            leftPersons.Add(p2);
            leftPersons.Add(p3);

            int totalTime = 0;

            while (leftPersons.Count != 0)
            {
                List<Person> twoFastSpeedPersons = FindTwoFastSpeedPersons(leftPersons);
                foreach (Person person in twoFastSpeedPersons)
                {
                    leftPersons.Remove(person);
                }
                rightPersons.AddRange(twoFastSpeedPersons);
                if (twoFastSpeedPersons.Count > 1)
                {
                    totalTime += twoFastSpeedPersons[1].Speed;
                }
                else if (twoFastSpeedPersons.Count == 1)
                {
                    totalTime += twoFastSpeedPersons[0].Speed;
                }
                else
                {

                }
                //-------------
                Console.WriteLine("---Go To Right---------->");
                foreach (Person person in twoFastSpeedPersons)
                {
                    Console.WriteLine(person.Speed);
                }
                Console.WriteLine("Total Time:" + totalTime);
                Console.WriteLine();
                //-------------

                if (leftPersons.Count == 0 || rightPersons.Count==5)
                {
                    break;
                }

                Person fastSpeedPerson = FindFastSpeedPerson(rightPersons);
                rightPersons.Remove(fastSpeedPerson);
                leftPersons.Add(fastSpeedPerson);
                totalTime += fastSpeedPerson.Speed;
                //-------------
                Console.WriteLine("<----------Go Back Left---");
                Console.WriteLine(fastSpeedPerson.Speed);
                Console.WriteLine("Total Time:" + totalTime);
                Console.WriteLine();
                //-------------
                if (leftPersons.Count == 0 || rightPersons.Count == 5)
                {
                    break;
                }

                List<Person> twoLowestSpeedPersons = FindTwoLowestSpeedPersons(leftPersons);
                foreach (Person person in twoLowestSpeedPersons)
                {
                    leftPersons.Remove(person);
                }
                rightPersons.AddRange(twoLowestSpeedPersons);
                totalTime += twoLowestSpeedPersons[0].Speed;
                //-------------
                Console.WriteLine("---Go To Right---------->");
                foreach (Person person in twoLowestSpeedPersons)
                {
                    Console.WriteLine(person.Speed);
                }
                Console.WriteLine("Total Time:" + totalTime);
                Console.WriteLine();
                //-------------
                if (leftPersons.Count == 0 || rightPersons.Count == 5)
                {
                    break;
                }

                fastSpeedPerson = FindFastSpeedPerson(rightPersons);
                rightPersons.Remove(fastSpeedPerson);
                leftPersons.Add(fastSpeedPerson);
                totalTime += fastSpeedPerson.Speed;
                //-------------
                Console.WriteLine("<----------Go Back Left---");
                Console.WriteLine(fastSpeedPerson.Speed);
                Console.WriteLine("totalTime:" + totalTime);
                Console.WriteLine();
                //-------------
                if (leftPersons.Count == 0 || rightPersons.Count == 5)
                {
                    break;
                }
            }

            Console.WriteLine("------------Total Time-------------");
            Console.WriteLine(totalTime);

            Console.ReadKey();

        }

        public static List<Person> FindTwoLowestSpeedPersons(List<Person> persons)
        {
            List<Person> sortedPersons = persons.OrderByDescending(s => s.Speed).ToList();
            List<Person> passedPersons = new List<Person>();

            if (persons.Count > 1)
            {

                passedPersons = new List<Person>();
                passedPersons.Add(sortedPersons[0]);
                passedPersons.Add(sortedPersons[1]);
            }
            else if (persons.Count == 1)
            {
                passedPersons.Add(sortedPersons[0]);
            }
            else
            {

            }

            return passedPersons;
        }

        public static List<Person> FindTwoFastSpeedPersons(List<Person> persons)
        {
            List<Person> sortedPersons = persons.OrderBy(s => s.Speed).ToList();
            List<Person> passedPersons = new List<Person>();

            if (persons.Count > 1)
            {

                passedPersons = new List<Person>();
                passedPersons.Add(sortedPersons[0]);
                passedPersons.Add(sortedPersons[1]);
            }
            else if (persons.Count == 1)
            {
                passedPersons.Add(sortedPersons[0]);
            }
            else
            {
                return null;
            }

            return passedPersons;
        }

        public static Person FindFastSpeedPerson(List<Person> persons)
        {
            if (persons.Count > 0)
            {
                List<Person> sortedPersons = persons.OrderBy(s => s.Speed).ToList();
                return sortedPersons[0];
            }
            else
            {
                return null;
            }
        }

    }
}

Person

namespace PassRiver
{
    public class Person
    {
        private int _speed;
        private Side _side;

        public Person(int speed)
        {
            _speed = speed;
            _side = Side.Left;
        }

        public int Speed
        {
            get { return _speed; }

            set { _speed = value; }
        }

        public Side Side
        {
            get { return _side; }

            set { _side = value; }
        }
    }
}

Side

namespace PassRiver
{
    public enum Side
    {
        Left = 0,
        Right = 1
    }
}

SortUtil

using System.Collections.Generic;

namespace PassRiver
{
    public static class SortUtil
    {
        public static List<Person> BubbleSort(List<Person> persons)
        {
            for (int i = 0; i < persons.Count - 1; i++)
            {
                for (int j = i + 1; j < persons.Count; j++)
                {
                    if (persons[i].Speed < persons[j].Speed)
                    {
                        Person temp = persons[j];
                        persons[j] = persons[i];
                        persons[i] = temp;
                    }
                }
            }

            return persons;
        }
    }
}

  

 

时间: 2024-12-20 17:04:51

夜过吊桥算法的相关文章

算法也是很过瘾的~~用面向对象实现~夜过吊桥~算法

问题描述 1.五个人打算过一座吊桥,开始时他们都位于该桥的一侧. 2.天很黑,五个人手里只有一个手电筒. 3.该桥一次最多只能同时过两个人,无论是一个人还是两个人过桥,都需要携带手电筒看路.而且手电筒只能通过人携带过桥的方式传递. 4.第一个人过桥需要1分钟时间,第二个人过桥需要2分钟,第三个人需要5分钟,第四个需要7分钟,第五个需要10分钟.由于速度不同,两个人一起过桥的话,速度以慢的人为准. 问题:求最快过桥时间.要求写出求解的算法. 分析题目 1.从左边到右边,需要有一个人拿着手电筒,到达

雪花六出---几幅算法生成的雪花图像,并祝大家平安夜和圣诞节快乐

今天和明天是平安夜和圣诞节,发几幅雪花的图像应下节日.本来是打算写个关于算法生成雪花的学术论文,但发现这东西很难写下去.主要是找不到一个提高论文逼格的数学公式,所以就发下博客吧.共有10幅PNG图像和3幅GIF动画图像,都是黑白二值化的图像. 雪花是种典型的混沌分形物体,在它身上能体现规则与随机的统一.说它规则是因为每一片雪花都是六边形的,至少有六边形的样子.而组成雪花的每一个分子都是随机混沌的.没有办法确定某一个水分子在生成雪花后位于雪花的哪个位置. 雪花是水分子的结晶,水分子又是由一个氧原子

(转)常用的算法设计与分析-一夜星辰的博客

算法设计与分析 分治法 思想 1. 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同.递归地解这些子问题,然后将各子问题的解合并得到原问题的解. 2. divide-and-conquer(P) { if(|P| <= n0)adhoc(P); divide P into samller subinstances P1,P2...,Pk; for(int i = 1;i < k;i++) { yi = divide-and-conquer(Pi); } retu

【学习排序】 Learning to Rank 中Listwise关于ListNet算法讲解及实现

前一篇文章"Learning to Rank中Pointwise关于PRank算法源码实现"讲述了基于点的学习排序PRank算法的实现.该篇文章主要讲述Listwise Approach和基于神经网络的ListNet算法及Java实现.包括: 1.基于列的学习排序(Listwise)介绍 2.ListNet算法介绍 3.ListNet算法Java实现 LTR中单文档方法是将训练集里每一个文档当做一个训练实例,文档对方法是将同一个查询的搜索结果里任意两个文档对作为一个训练实例,文档列方法

远景面试算法题——FolderSize

描述 文件被存储在磁盘上的时候,通常为cluster方式.每个cluster具有固定的大小,一个文件所消耗的空间量始终是cluster大小的整数倍.因此,如果cluster的大小为100字节,165字节的文件将会使用实际使用200字节的存储空间,造成35个空间的浪费. 一个folder会有多个file,每个file单独计算浪费空间:如果某个folder没有出现,浪费空间为0 定义 Method signature: int[] calculateWaste(String[] files, int

快速幂取余算法

下面是一个快速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子,得 如此反复提取公因子,最后将函数化为 令 ...... 则即为所求 下面是讲解快速幂的:(By  夜せ︱深   感谢作者) 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求

【坐在马桶上看算法】算法12:堆——神奇的优先队列(下)

接着上一Pa说.就是如何建立这个堆呢.可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入(转移到堆中为止).因为插入第i个元素的所用的时间是O(log i),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下. n=0; for(i=1;i<=m;i++) {     n++;     h[ n]=a[ i];  //或者写成scanf("%d",&h[ n]);     siftup(); } 其实我们还有更快得方法来建立堆.它是这样的. 直接

【算法江湖】哈希之战【上】

[算法江湖]哈希之战[上] 文章很长,但超级干货,值得收藏! 虽然下面的文字略有嘻哈的感觉,但我还是希望您在阅读之后,能够本着严肃的态度,来审视一番当今天下最有用的数据结构~哈希表(hash table).因为,有人的地方就有江湖,有数据的地方就有哈希. 2015年,6月7日~6月9日,在史上最强计算机技术微信群里,发生了一场史诗级别的算法论战. 此战,因参与者阵容之强,脑洞之大,足可彪炳微信群聊史册.无论你是技艺精湛的码农,还是拼杀股市的大妈,这次讨论都可以令你受益匪浅.好了,在你准备浏览下述

史上最强算法论战:请不要嘻哈,这是哈希[下]

史上最强算法论战:请不要嘻哈,这是哈希[下] 欢迎个人转发朋友圈,机构及媒体转载需在开篇声明,转自微信公号“知象科技” 论战主角之一龙博:知象科技CEO,欲了解龙博及知象科技,请点击文末“阅读原文”. 这是“美丽互联”微信群里的一次算法论战,感谢书记员硅谷寒(梁寒)精彩的说书般的整理. 书接上文 一夜过去了…孤独虎精神抖擞的回来了! [书记员注:上集说到独孤虎被龙博两次判零分,已经到了精神分裂的边缘.于是他决定回家休养生息,以图再战.果不其然,第二天,独孤虎首先跳出来,带来了他的第四种方案.我们