贪心算法
Problem1删数问题
题目描述:
给定一正整数n(n的位数小于240),现要删除数n中的s个数码,使其得到的新数最小,求这个最小数。
输入
输入有两行,第一行为整数n,第二行即为s
输出
输出一行,即最小的那个数
Problem2旅行家的预算
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离i、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入
输入第一行有5个数:D1,c,D2,P,N(前四个为实数,N为整数,N<=1000)
后面有N行,每行两个实数,分别表示对应的加油站离出发点的距离,与每升汽油的价格
输出
输出仅一行,即最少花费
Problem3线段覆盖
题目描述
给定数轴上的n条线段(n<100),每个线段有其端点ai、bi组成(-999<=ai<bi<=999),由于有些线段会相互覆盖,所以求出至少去掉多少条线段,才能使剩下的所有线段之间互相没有内部公共点(若只是端点重合,则不是内部公共点)。
输入
输入第一行为整数N,接下来有N行,分别描述每条线段
输出
输出第一行为最少删除的线段数s
后面s行描述一个可行的删除方案,即删除那些线段
Problem4背包问题
题目描述
有一个贼在偷窃一家商店时发现有N件物品:第i件物品值Vi元,重Wi磅,(1≤i≤n),此处Vi和Wi都是整数。他希望带走的东西越值钱越好,但他的背包中最多只能装下W磅的东西(W为整数),小偷可带走某个物品的一部分(只带走其中的几磅),小偷应该带走哪几件东西,每件东西的重量是多少?
输入
输入第一行为N(N<=10000),后面N行描述每个物品,每行两个数,即为Vi与Wi
输出
输出第一行为大的最大价值,后面依次描述物品i应偷多少(如果没偷,则不输出,输出对应的i为升序)。
Problem5任务调度
题目描述
一个单位时间任务是个作业,如要在计算机上运行一个程序,它恰覆盖一个单位的运行时间。给定一个单位时间任务的集合S,对S的一个调度即S的一个排列,其中规定了这些任务的执行顺序。该调度中的第一个任务开始于时间0,结束于时1;第二个任务开始于时间1, 结束于时间2;……。单处理器上具有期限和罚款的单位时间任务调度问题的输入如下:
1.包含n个单位时间任务的集合S={1,2,……,n};
2.n个取整的期限d1,……,dn,(1≤d,≤n),任务i要求在di前完成;
3.n个非负的权(或罚款)w1,……,wn。如果任务i没在时间di之前结束,则导致罚款wi;
要求找出S的一个调度,使之最小化总的罚款。
输入
输入第一行为N(N<=1000),后面N行每行两个数,即为对应的di与wi
输出
输出最小总罚款Problem6果子合并
Problem6果子合并
题目描述
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
输入
输入第一行为N(N<=1000),第二行有N个整数,分别描述每个果子
输出
输出一个数即最小代价
Problem7射击竞赛
题目描述
射击的目标是一个由R*C(2≤R≤C≤1000)个小方格组成的矩形网格。每一列恰有2个白色的小方格和R-2个黑色的小方格。行从顶至底编号为1-R,列从左至右编号为1-C。射击者可射击C次。在连续的C次射击中,若每列恰好有一个白色的方格被射中,且不存在无白色方格被射中的行,这样的射击才是正确的。如果存在正确的射击方法,则要求找到它。
输入
输入第一行为R,C,后面R行每行C个数,如果为0则为白格,1则为黑格
输出
输出正确方案——每行两个数即射击坐标,否则输出-1
Problem8任务安排
题目描述
一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B。每个操作只有一些机器能够完成。A型机器从输入库接受工件,对其施加操作A,得到的中间产品存放在缓冲库。B型机器从缓冲库接受中间产品,对其施加操作B,得到的最终产品存放在输出库。所有的机器平行并且独立地工作,每个库的容量没有限制。每台机器的工作效率可能不同,一台机器完成一次操作需要一定的时间。 给出每台机器完成一次操作的时间,计算完成A操作的时间总和的最小值,和完成B操作的时间总和的最小值。
输入
输入第一行 三个用空格分开的整数:
N,工件数量 (1<=N<=1000)
M1,A型机器的数量 (1<=M1<=30)
M2,B型机器的数量 (1<=M2<=30)
第二行……,接下来M1个整数(表示A型机器完成一次操作的时间,1..20),接着是M2个整数(B型机器完成一次操作的时间,1..20)
输出
只有一行。输出两个整数:完成所有A操作的时间总和的最小值,和完成所有B操作的时间总和的最小值(A操作必须在B操作之前完成)。
Problem9最小差距
题目描述
给定一些不同的一位数字,你可以从这些数字中选择若干个,并将它们按一定顺序排列,组成一个整数,把剩下的数字按一定顺序排列,组成另一个整数。组成的整数不能以0开头(除非这个整数只有1位)。
例如,给定6个数字,0,1,2,4,6,7,你可以用它们组成一对数10和2467,当然,还可以组成其他的很多对数,比如210和764,204和176。这些对数中两个数差的绝对值最小的是204和176,为28。
给定N个不同的0~9之间的数字,请你求出用这些数字组成的每对数中,差的绝对值最小的一对(或多对)数的绝对值是多少?
输入
输入第一行包括一个数T(T≤1000),为测试数据的组数。
每组数据包括两行,第一行为一个数N(2≤N≤10),表示数字的个数。下面一行为N个不同的一位数字。
输出
输出T行,每行一个数,表示第i个数据的答案。即最小的差的绝对值