pascal题目求解.

来源:百度知道 编辑:UC知道 时间:2024/06/22 09:10:06
1、智力大冲浪(riddle.???)
[问题描述]
小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则:
首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成,1≤ti≤n,如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi,wi为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱!注意:比赛绝对不会让参赛者赔钱!

[问题输入]
输入文件riddle.in,共4行。
第1行为m,表示一开始奖励给每位参赛者的钱;
第2行为n,表示有n个小游戏;
第3行有n个数,分别表示游戏1到n的规定完成期限;
第4行有n个数,分别表示游戏1到n不能在规定期限前完成的扣款数。
[问题输出]
输出文件riddle.out,仅1行。表示小伟能赢取最多的钱。
[输入样例]
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
[输出样例]
9950

请告诉我具体思路,方法,并解释一下输入数据.
什么意思?不懂...
一时段是多少?最大限制时间是多少?
怎么算出来?请高手们具体解释一下为什么游戏要按那样的顺序玩
帮个忙啊!为什么第五、六个游戏玩不了?

首先第一行为你的钱数,第二行表示有n个游戏,并且有n个时间段,第三行表示每个游戏必须在某个时间段前完成,最后一行即没有完成相应游戏的扣钱数。
显然输入数据为7个时间段。在第一个时间段玩第1个游戏,第二个玩第2个游戏,第三段玩第4个游戏,第四段玩第3个游戏,第五段玩第7个游戏。这样没有玩第5、6个游戏,扣钱为20+30=50,所以答案为10000-50=9950

这道题用二分图好是好,但编程复杂度高,容易出错,速度也不怎样。
这题一般用的是贪心算法,可以根据游戏的时间或价值进行排序。
假设是按价值排序:
每次选一个价值最大的不超过时限的游戏,累计答案,最后输出即可。

我先解释一下输入数据。
首先第一行为你的钱数,第二行表示有n个游戏,并且有n个时间段,第三行表示每个游戏必须在某个时间段前完成,最后一行即没有完成相应游戏的扣钱数。
显然输入数据为7个时间段。在第一个时间段玩第1个游戏,第二个玩第2个游戏,第三段玩第4个游戏,第四段玩第3个游戏,第五段玩第7个游戏。这样没有玩第5、6个游戏,扣钱为20+30=50,所以答案为10000-50=9950
这题做法是二分图匹配,用km算法,让每个游戏和可行的时间连边,求一下最佳匹配就行,然后再用总扣钱数减求出的最佳匹配的扣钱数,再用n减去它即可。

楼上的你说的贪心不行的,比如有2个游戏价值分别为10和100,而第一个游戏必须在第一时区玩第二个必须在第二时区以前,而贪心的话会用第一时区去玩第二个游戏,而第一个游戏玩不到了,所以肯定不行,这道题应该没有别的方法。

还有回楼主,不那样安排顺序你能安排出一个更合理的么?

为什么非要玩游戏七——这个需要做最久时间、扣的钱数最少的游戏呢?
究竟是按照怎样的顺序排序呀?

【算法分析】
因为不同的小游戏不能准时完成时具有不同的扣款权数,而且是最优解问题,所以本题

很容易就想到了贪心法.贪心的主要思想是要让扣款数值大的尽量准时完成.这样我们

就先把这些任务按照扣款的数目进行排序,把大的排在前面,先进行放置.假如罚款最多

的一个任务的