过桥问题

趣味程序设计_过桥问题

霸气de小男生 提交于 2020-03-01 12:21:19
题目描述 过桥问题。有N(N≥2)个人在晚上需要从X地到达Y地,中间要过一座桥,过桥需要手电筒(而他们只有1个手电筒),每次最多两个人一起过桥(否则桥会垮)。N个人的过桥时间依次存入数组t[N]中,分别为:t[0], t[1], ……, t[N-1]。过桥的速度以慢的人为准!注意:手电筒不能丢过桥!问题是:编程求这N个人过桥所花的最短时间。 输入 有多组测试数据,每组数据先输入一个人数N,然后输入这N个人过桥所花的时间。 输出 输出对应的最短时间。 样例输入 4 1 2 5 10 4 5 2 10 1 样例输出 17 17 提示 4人过桥问题最佳方案构造法:以下是构造N个人(N≥1)过桥最佳方案的方法: 1、如果N=1、2,所有人直接过桥。 2、如果N=3,由最快的人往返一次把其他两人送过河(本次过去3个人)。 3、如果N≥4,设ZKer、CKer为走得最快和次快的旅行者,过桥所需时间分别为Tzk、Tck;而ZMer、CMer为走得最慢和次慢的旅行者,过桥所需时间分别为Tzm、Tcm。那么 a)当2 Tck>=Tzk+Tcm时,使用模式一将ZMer和CMer送过桥;(模式一:ZKer、ZMer过去,ZKer返回送手电,再ZKer、CMer过去,ZKer返回送手电,即总是由最快的把2个最慢的送过桥。本模式实际将2个最慢的人送过桥,用时Tzm+Tzk+Tcm+Tzk); b) 当2

微软十七道智力面试题及答案

不羁的心 提交于 2020-02-08 23:12:49
微软十七道智力面试题及答案 问题 1、你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段 ,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你 的工人付费? 2、请把一盒蛋糕切成8份,分给8个人,但蛋糕盒里还必须留有一份。 3、一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问? 4、一群人开舞会,每人头上都戴着一顶帽子。帽子只有黑白两种,黑的至少 有一顶。每个人都能看到其他人帽子的颜色,却看不到自己的。主持人先让大家看 看别人头上戴的是什么帽子,然后关灯,如果有人认为自己戴的是黑帽子,就打自 己一个耳光。第一次关灯,没有声音。于是再开灯,大家再看一遍,关灯时仍然鸦 雀无声。一直到第三次关灯,才有劈劈啪啪打耳光的声音响起。问有多少人戴着黑 帽子? 5、请估算一下CN TOWER电视塔的质量。 6、一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯 从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到最 大的一颗? 7、U2合唱团在17分钟内得赶到演唱会场,途中必需跨过一座桥,四个人从桥 的同一端出发,你得帮助他们到达另一端,天色很暗,而他们只有一只手电筒。一

《吃豆子过桥问题》——经典智力题、面试题(转)

十年热恋 提交于 2019-12-03 14:37:37
吃豆子过桥问题   本题来自于百度校招 面试题 ,通过一个简单的智力问题理解递归问题的解法。    一:问题描述   一个人要过一座 80 米的桥,每走一米需要吃一颗豆子,他最多可以装 60 颗豆子,问最少需要吃多少颗豆子才能走完桥?    二:初步分析   1. 一趟(不折回)最多只能走 60 米豆子就会被吃完;   2. 如果有折回,必须保证能够返回到有豆子的地点,且在折回点放下的豆子尽量多;   3. 尽可能少的折回(次数和折回的距离都要少,毕竟一趟折回就要多消耗一个来回的豆子);   4. 折回点的豆子数量要求至少能够走完剩余的部分;    三:具体分析   1. 由条件 1 得一趟走不完,由条件 3 我们可以考虑折回尽量少的次数能否走完。   先考虑只折回一次,那么此时就要求得折回点的位置。   2. 由条件 3 得折回的距离尽量短,那么可以考虑最短的折回距离,很明显应该是 20 米处;设折回点距离起始位置 x 米,则此时 x=20; 那么在 x 处,需要至少有 60 颗豆子,一次性拿 60 颗豆子走完最后一程。   那么问题就来了,怎么在 x 处囤积 60 颗豆子呢,假使他第一次信心满满的拿着 60 颗豆子,走到 x 处就只剩下 40 颗了,现在不够走完剩余的全程啊,只能放下一部分折回去再取了,那放多少呢,很明显由条件 2 得我们需要放下 20 颗,拿着 20

(过桥问题)Bridge UVA - 10037(Ad Hoc)

匿名 (未验证) 提交于 2019-12-03 00:30:01
传送门 问题分析 : ,每条船只能坐两人 。 桥 ,那过桥的时间就是那个人的过 桥 时间; 桥 ,那过 桥 的时间就是慢的那个人的过 桥 时间; 桥 ,开始时间最短的两个人过 桥 ,然后时间最短的那个人回去接时间最长的那个人,若三人过 桥 时间为a、b和c则过河时间是a+b+c; 桥 时,就由时间最短的两个人送时间最长的两个人(反正这两人都要过 桥 ,就先过)过 桥 ;送两人过桥后,人数就减少两人;假设四人过河时间分别是 a、b、c和d,并且a<=b<=c<=d, 这时又分为两种情况过河: 桥 情况是ac、a、ad和a,先把c和d先送过; ,先把c和d先送过 ; #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1005; int a[maxn]; int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++){ if(i!=1){ printf("\n"); } int n; scanf("%d",&n); for(int j=0;j<n;j++){ scanf("%d",&a[j]); } sort(a,a+n); int m=n,ans=0; while(m>=4){ ans+=min(a[0