算法分析贪心算法习题
{删除字符串n的第i个字符} s = s – 1; } 输出n;
如果一个游戏没能在规定期限前完成, 则要从奖励费m元中扣去一部分钱wi, wi为自然数。不同的游戏扣去的钱数是 不一样的。
问题描述
当然,每个游戏本身都很简单,保证每 个参赛者都能在一个时段内完成,而且 都必须从整时段开始。主持人只是想考 考每个参赛者如何安排组织自己做游戏 的顺序。
作为参赛者,小伟如何赢取最多的钱!
删数问题
通过键盘输入一个高精度的n(n≤240)位正整数N, 去掉其中任意s个数字后,剩下的数字按原左右次序 将组成一个新的正整数。编程对给定的n和s,寻找 一种方案,使得剩下的数字组成的新数最小。 输入:N
s 输出:最后剩下的最小数
样例输入:178543 S=4
样例输出:13
问题分析
由于正整数N的有效位数最大可达240 位,所以可以采用字符串类型来存储N
解题思路
这个题目思路很容易想,肯定是优先使 用半径大的喷水装置。因为半径越大的 喷水装置所能覆盖的范围就越大。
其实这个确定优先选择哪一个的过程就 是贪心选择的过程。
所以本题就是先对所有的喷水装置半径 排序,计算出,每个喷水装置所能覆盖 的长度。每次都选出当前半径最大的, 直到能覆盖完所有的草地。
智力大冲浪
【问题描述】 小伟报名参加电视台的智力大冲浪节目。本 次挑战赛吸引了众多参赛者,主持人为了表 彰大家的勇气,先奖励每个参赛者m元。先 不要太高兴!因为这些钱还不一定都是你的! 接下来,主持人宣布了比赛规则:
问题描述
首先,比赛时间分为n个时段,它又给 出了很多小游戏,每个小游戏都必须在 规定期限 ti 前完成(1<=ti<=n)。
贪心算法习题
排队接水
【问题描述】 有n个人在一个水龙头前排队接水。
假如每个人接水的时间为Ti,请编程找 出这n个人排队的一种顺序,使得n个人 的平均等待时间最小。
独木舟
【问题描述】 我们计划组织一个独木舟旅行。租用的独木 舟都是一样的,最多乘两人,而且载重有一 个限度。现在要节约费用,所以要尽可能地 租用最少的舟。你的任务是读入独木舟的载 重量,参加旅行的人数以及每个人的体重, 计算出所需要的租船数目。
:9 体重:
90 20 20 30 50 60 70 80 90
算法分析
基于贪心法,找到一个重量最大的人, 让它尽可能与重量大的人同乘一船。如 此循环直至所有人都分配完毕即可统计 出所需要的独木舟数。
喷水装置
现有一块草坪,长为20米,宽为2米, 要在横中心线上放置半径为Ri的喷水装 置,每个喷水装置的效果都会让以它为 中心的半径为实数Ri(0<Ri<15)的圆被湿 润,这有充足的喷水装置i(1<i<600)个, 并且一定能把草坪全部湿润,你要做的 是:选择尽量少的喷水装置,把整个草 坪的全部湿润。
重复以上过程s次,剩下的数字串便是问题的 解了。
问题分析
例如:n=178543
s=4
删数的过程如下:
n=178543 {删掉8}
n=17543 {删掉7}
n=1543 {删掉5}
n=143 {删掉4}
n=13
{解为13}
输入s, n; while s > 0 do { i:=1; {从串首开始找} while (i < length(n)) and (n[i]<n[i+1]) do i:=i+1; delete(n,i,1);
应如何来确定该删除哪s位呢?是不是 只要删掉最大的s个数字就可以了呢?
问题分析
为了尽可能地逼近目标,我们选取的贪心策 略为:每一步总是选择一个使剩下的数最小 的数字删去,即按高位到低位的顺序搜索, 若各位数字递增,则删除最后一个数字,否 则删除第一个递减区间的首字符。然后回到 串首,按上述规则再删除下一个数字。
假如罚款最多的一个任务的完成期限是k,我们应该 把它安排在哪个时段完成呢?应该放在第k个时段, 因为放在1~k中的任何一个位置上时,效果都是一样 的。
分析
一旦出现一个不可能在规定时限前完成 的任务,则把其扔到最大的一个空时间 段内。这样做的效果必然是最优的,因 为不能完成的任务,在任意一个时间段 中罚款数目都是一样的。
【样例】 输入
初始奖金:10000 游戏个数:7
结束时段:4 2 4 3 1 4 6 罚款金额:70 60 50 40 30 20 10
输出 9950
分析
因为不同的小游戏不能准时完成时,具有不同的扣 款权数,而且是最优解问题,所以,很容易就想到 用贪心法来求解本题。
根据贪心思想,应让扣款数值大的尽量准时完成。 这样,我们就先把这些任务按照扣款的数目进行排 序,把大的排在前面,先进行放置。