pascal题目求解.

[复制链接]
查看11 | 回复2 | 2008-3-15 16:16:30 | 显示全部楼层 |阅读模式
我先解释一下输入数据。首先第一行为你的钱数,第二行表示有n个游戏,并且有n个时间段,第三行表示每个游戏必须在某个时间段前完成,最后一行即没有完成相应游戏的扣钱数。显然输入数据为7个时间段。在第一个时间段玩第1个游戏,第二个玩第2个游戏,第三段玩第4个游戏,第四段玩第3个游戏,第五段玩第7个游戏。这样没有玩第5、6个游戏,扣钱为20+30=50,所以答案为10000-50=9950这题做法是二分图匹配,用km算法,让每个游戏和可行的时间连边,求一下最佳匹配就行,然后再用总扣钱数减求出的最佳匹配的扣钱数,再用n减去它即可。楼上的你说的贪心不行的,比如有2个游戏价值分别为10和100,而第一个游戏必须在第一时区玩第二个必须在第二时区以前,而贪心的话会用第一时区去玩第二个游戏,而第一个游戏玩不到了,所以肯定不行,这道题应该没有别的方法。还有回楼主,不那样安排顺序你能安排出一个更合理的么?
回复

使用道具 举报

千问 | 2008-3-15 16:16:30 | 显示全部楼层
为什么非要玩游戏七——这个需要做最久时间、扣的钱数最少的游戏呢?究竟是按照怎样的顺序排序呀?
回复

使用道具 举报

千问 | 2008-3-15 16:16:30 | 显示全部楼层
【算法分析】因为不同的小游戏不能准时完成时具有不同的扣款权数,而且是最优解问题,所以本题很容易就想到了贪心法.贪心的主要思想是要让扣款数值大的尽量准时完成.这样我们就先把这些任务按照扣款的数目进行排序,把大的排在前面,先进行放置.假如罚款最多的一个任务的完成期限是k,我们应该把它安排在哪个时段完成呢 应该放在第k个时段,因为放在1~k任意一个位置,效果都是一样的.一旦出现一个不可能在规定时限前完成的任务,则把其扔到最大的一个空时间段,这样必然是最优的,因为不能完成的任务,在任意一个时间段中罚款数目都是一样的本题也可以有另外一种贪心算法,即先把所有的数据按照结束时间的先后排序,然后从前向后扫描. 当扫描到第n个时段,发现里面所分配的任务的结束时间等于n-1,那么就说明在前面这些任务中必须舍弃一个,于是再扫描第1~n这n个时段,挑出一个最小的去掉并累加扣款值,然后再去调整排列顺序,让后面的元素填补前面的空缺,参考资料:http://hi.baidu.com/ya%5Fch%5Fyv/blog/item/cf7f040afce5163db0351d24.html

已赞过已踩过<
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行