手电筒过河

一。问题:

夜晚n位旅行者要过桥,总共只有一个手电筒,一次最多两人过桥,且过桥必须使用手电筒。每位旅行者单独过桥的所需的时间已知,两人结伴渡桥所用的时间为两人中最长的时间。

求解所有人过桥所用的总时间最短是多少。

二。分析:

因为只有一个手电筒,必定有人过桥之后,还要将手电筒送回来。

若n=1,或n=2  所有人直接过河。

若n=3 ,最快的人往返一次把两个人送过去。

若n=4时,假设四人耗时从少到多依次为a ,  b,  y,  z.

  那么有两种方案过河,

  方案一:ab一起过河,a返回,yz一起过河,b返回接a    耗时b+a+z+b+b

  方案二:ay一起过河,a返回,az一起过河,a返回接b    耗时y+a+z+a+b

  这两种方案的末状态一定是:最大的两个已经过河,最小的两个留在河这面

  两方案的时间差为2b-a-y

  当2b>a+y时,采用方案2, 当2b<=a+y时,采用方案1.

若n>4时,该问题相当于两个快的一直在送最慢的两个,因此递归求解,转化成n-2个旅行者的问题。

#include<stdio.h>
#include<string.h>
#include<algorithm>
 using namespace std;
 int p[1100];
 int cmp(int a,int b)
   {
   	return a<b;
   }
 int Time(int n)
   {
   	if(n==1)   return p[0];
   	if(n==2)   return p[1];
	if(n==3)   return p[0]+p[1]+p[2];
	if(p[1]*2>=p[0]+p[n-2])
	     return 2*p[0]+p[n-1]+p[n-2]+Time(n-2);
	 else
	     return 2*p[1]+p[0]+p[n-1]+Time(n-2);
   }
   int main()
     {
     	int T;
     	int n;
     	int i,j;
     	scanf("%d",&T);
     	while(T--)
     	  {
     	  	scanf("%d",&n);
     	  	memset(p,0,sizeof(p));
     	  	for(i=0;i<n;i++)
     	  	 {
     	  	 	scanf("%d",&p[i]);
     	  	 }
     	  	 sort(p,p+n,cmp);
     	  	 printf("%d\n",Time(n));
     	  }
     	return 0;
     }

  

时间: 2024-08-26 09:55:32

手电筒过河的相关文章

过河问题--nyoj题目47

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,N人所需要的时间已知:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这N人尽快过桥. 输入 第一行是一个整数T(1<=T<=20)表示测试数据的组数每组测

nyoj 47 过河问题

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,N人所需要的时间已知:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这N人尽快过桥. 输入 第一行是一个整数T(1<=T<=20)表示测试数据的组数每组测

过河问题(贪心算法)

一.问题描述 在漆黑的夜里,甲乙丙丁共四位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,四个人一共只带 了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,四人所需要的时间分别是1.2.5.8分钟:而如果两人同时过桥,所需要的时间就是走 得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这四人尽快过桥. 二.问题答案       这个问题本身并不太难,即使用简单的枚举法逐一尝试也能找到正确答案. 两人过桥后,需要

南阳47(过河问题)

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,N人所需要的时间已知:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这N人尽快过桥. 输入 第一行是一个整数T(1<=T<=20)表示测试数据的组数每组测

POJ-1700 &amp;&amp;NYOJ 47 过河问题【贪心】

链接:NYOJ:click here POJ:click here 题意: 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,N人所需要的时间已知:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这N人尽快过桥. 思路: 贪心思想(一般都是先排序) 每次从此岸到对岸移动的两个人要么这两个人中有一

过河问题(南阳oj47)(贪心)

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,N人所需要的时间已知:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这N人尽快过桥. 输入 第一行是一个整数T(1<=T<=20)表示测试数据的组数 每组

过河问题 贪心

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,N人所需要的时间已知:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这N人尽快过桥. 输入 第一行是一个整数T(1<=T<=20)表示测试数据的组数每组测

NYOJ-47过河问题

这是一道经典的贪心算法的题目.首先说一下我对这道题的理解: n个人要过河,已知每个人的过河时间且过河时必须要使用唯一的手电筒.桥只能允许最多 两个人同时过河.让求所有人都过河后的最短时间. 我们不难知道:必须同时两个人过河,因为要把手电筒送回来,让为过河的人过河.使用贪 心的思想解决这个问题,首先要对这n个人的过河时间排序并保存在数组S中.这也是大多数贪心 解决问题的共同点. 根据贪心原则,我们有两个贪心策略: 策略A: 让最快的两个人去送最慢的两个人.首先S[0]和S[1]过河,S[0]把手电

nyoj 47——过河问题——————【贪心】

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过桥的话,N人所需要的时间已知:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,如何设计一个方案,让这N人尽快过桥. 输入 第一行是一个整数T(1<=T<=20)表示测试数据的组数每组测