注册 登录
编程论坛 C++教室

登山问题 --- NOI 92

Arcticanimal 发布于 2007-07-04 20:19, 1584 次点击
Editted the title so that it is more descriptive.

To Original poster:

Please make the problem statement more precise.


在csdn里看到这个题目

《登山问题》
有一支登山队伍(k人)要去爬一座很高很高的山,每一个人上山和下山都需要N天。每个人出发时带一定的干福ǖ趇人带M[i]),每天会消耗一定量的干粮( 第i人每天消耗E[i] ).队员同时出发,要求出发N天后有人到达山顶,出发2N天后无人滞留山上。由于可能 M[i]<=E[i]* 2N 可以有队员中途折回,把干粮让给其他的同伴(保证自己要能活着回去!)

输入N
输入 k
输入 M[i]
输入 E[i]
输入保证有解的情况下
1。输出最省粮食的组队方法
2。输出人最少的组队方法

例如,输入 3 3
5 8 9
2 1 4
输出最省粮食的组队 第二个人 携带6的干粮 一个人上山
人最少的组队方法 第二个人 携带6的干粮 一个人上山

似乎有些麻烦,这样的题目除了穷举法有没有其他的算法呢?

[此贴子已经被HJin于2007-7-6 10:47:04编辑过]

13 回复
#2
天空の城2007-07-04 20:48
M[i]&lt;=E[i]* N 应该是 M[i]&lt;=E[i]* 2N 吧???
#3
天空の城2007-07-04 20:49

而且题目要求什么也没理解,我笨笨

#4
aipb20072007-07-04 20:49
似乎是个典型的算法,叫……算了,怕说错。

还没研究……
看看。
#5
Arcticanimal2007-07-04 21:02
是 M[i]&lt;=E[i]* 2N ,打错了
#6
dlcdavid2007-07-05 11:17

1。输出最省粮食的组队方法
找出E[i]的值最低的第i个人,让他上山,就只需要E[i]*2N的粮食。
2。输出人最少的组队方法
人最少吗,就是一个人撒,,跟上面一样撒
或者就再判定是否每个i都有足够的粮食独自上山,然后,输出方法

不知道我是不是把题理解错了,,或者题可能有点问题

#7
dlcdavid2007-07-05 11:33
1。输出最省粮食的组队方法
应该还要求上去的人最多吧?

1.也就是说M[1]+M[2]+...+M[i]粮食总量M //应该是M[i]是第i+1个人的粮食携带量吧~~呵呵,,该是按你说的做
2.
M/(2N)就是每天的最大消耗量E,
3.再把E[i]排序
4.从低值加到高值,不超过E就行了撒.

2。输出人最少的组队方法
应该还要求尽量把粮食用完吧?

1.同上
2.同上
3.同上
4.逆序
#8
HJin2007-07-05 11:44
It would be better that the author could give a few examples for each case and make the problem statement more precise.

#9
野比2007-07-05 11:45

似乎队员可以在1-N的任一天上山... wow...

#10
wsaaa2007-07-05 21:20

不怎么明白这个题目的意思啊!

#11
Arcticanimal2007-07-05 21:21
其余的条件全靠自己判断
回6,7楼 消耗最少的人不一定能带足够多的粮食供2N天用,每个人不一定都带自己能带的最多粮食 也就是说一定要考虑协作!
回9楼 必须满足出发N天后有人到达山顶,出发2N天后无人滞留山上。这样,只能第一天出发。
#12
HJin2007-07-06 10:43
回复:(Arcticanimal)貌似很麻烦的题目...试试看 :)...

原文链接:http://www.mydrs.org/program/list.asp?id=111

问题

  攀登某高山,假定上下山速度相等。从山脚到顶峰有N天的路程(N<10)。某登山队有P名队员,每人可负载最大给养量和每天消耗的给养量各不相同,只要在N天内全队有一个队员登上顶峰,并且在2N天内所有参加登山的队员安全返
回山脚,就算此次登山成功。登山规则:参加登山的队员同时同地出发,在山上不许停留;给养可以相互补给,但必须由登山队员随身携带。编程要求:用键盘输入天数N,队员数P,队员按1,2,…,P编号。然后按编号输入每个队员的可
负载最大给养量和每天的消耗的给养量(给养单位为公斤)。输出两个登山计划。 其一是,在参加登山的队员数最少的情况下消耗总给养量尽可能少的计划;其二是,消耗给养最少时的计划。登山计划的内容是:有多少队员参加登山,在出发时每人各带多少天的给养,每人各在出发几天后返回。
           


题义分析

  本题给出了P个登山队员每人的最大给养负重和每天的消耗,要求在保证至少一人登顶且所有人员安全返回的情况下,确定两个登山方案,使得:

  1. 参加登山人数最少,消耗给养尽可能少

  2. 消耗给养最少。注意每个队员的"能力"是不同的,包括负重和消耗。显然,负重越大,消耗越少的队员,越有利于登山。              


算法分析  

   之所以要从P个队员中选择若干人登山,是因为每个队员的负重能力有限,不可能背负2N天所需的所有给养,所以在登顶过程中,不但要吃自己的给养,也要吃他人的给养,才能保证登顶并安全返回。

   所以我们确定一个方案时关心以下内容:                   

   1. 由谁完成登顶任务。根据题意,只要一个人登顶即可,我们假设是编号为Final的登山队员。那么除了Final之外,其他人都不必登顶(否则就"浪费"了)。通常,Final的最大负重无法满足自身2N天的要求,在登山过程中要吃他人的给养。  

   2. 队员之间的如何相互支持。                      

   3. 除Final以外的队员如何在合适的时间返回。                 

   4. 各队员分别在出发时带多少给养。                      


登山过程   

   登山的过程比较复杂,牵涉到队员携带的给养、返程时间、互相支援等方方面面, 这些都是不确定的因素,如果从起始点开始考虑,有千头万绪无从下手的感觉。例如确定各队员返程日期,若某队员返程早,可以节省给养,但余下的队员可能因得不到支持而无法登顶;反之,如果该队员太迟返程,则可能导致总给养耗费过大或无给养下山等问题。

   因此,我们考虑用倒推的方法,从"登顶"这一目的出发,逐一确定登山的过程。   

   由于只有Final一人登顶,所以在登顶以后他必须吃自己的给养下山。同时,在此以 前他也应当尽量先吃他人的给养--这样意味着他人可以尽早下山,减少花在他人身上的给养。如图1,假设Final在登山开始后第X1天开始吃自己的给养,则至少一名队员要"陪"Final到第
X1-1天,以供给Final。那么需要多少名队员到X1-1天开始返程呢?一名队员就够了,因为除Final之外的队员越早返程,所消耗的总给养越少。假设这名队员是T1。图1是T1支持Final的情况。  
                  


  其中X2至X1一段T1和Final的给养由T1单独提供。所以T1的给养用在X2X1至起点一段, Final的给养用在X1至终点一段。图1中粗线部分,T1和Final的给养"尚无着落"。我们考虑让别的登山队员来保证他们能顺利到达X2(实际上,从X2以后,其他队员都可以回山脚,
T1与Final继续前进)。假设由T2来提供一部分的给养。图2表示了T2的给养分配状况。 由于起点至X3一段3人的给养还需要他人支援(如果这一段>0)。那么我们继续引入T3、T4…
直到不需要额外的支援,即某一个XK和起点重合。   

   以上的分析是通过倒推的形式确定登山的过程,现在我们来看看从登山的开始到结束的全过程: (图2)  

   假设共由M+1人参加登山。

   在起点至XM段,TM负责全队的给养,然后在XM处,返程过程中吃自己的给养。   

   在XM至XM-1段,TM-1负责继续登山的队员(全队除去TM)的给养,然后在XM-1处返程,返程过程中吃自己的给养。   

   在XI+1至XI段,TI负责继续登山队员的给养,然后在XI处返程,返程过程中吃自己的给养。

   从X1处开始,只有Final一人继续登山,登顶后返程。这一过程Final吃自己的给养。

   登山成功。


确定人选

  如图3示,登山过程中的Final、T1、T2等队员需要从已知的P个登山队员中选择。由于登山的过程已经确定,那么只要确定具体人选和担负的"职责",就可以确定所需给养总量。
img src="pic/0003.gif" width="235" height="201"border="0">
  确定人选的过程可以用枚举的方法实现,比如用深度优先搜索。在搜索过程中,可以将两个任务分开搜索。因为任务一的最优解生成趋势是人数逐渐变少,费用逐渐增多,而任务二的最优解生成趋势是人数逐渐变多,费用逐渐减少(见图3)。分别编写两个搜索两种任务的子程序,可以有效地进行较为有效的截枝。


总结   

  本题解题的过程是一个倒推的过程。确定登山的过程是解题的关键,这一过程紧紧抓住"登顶"这一目的,使得目标明确,思路比较清晰。

作者:羌云云
来源:曙光奥赛
时间:2001-07-13

#13
Arcticanimal2007-07-06 14:54
豁然开朗...
#14
野比2007-07-06 20:52
了解...
1