Problem
卡门——农夫约翰极其珍视的一条Holsteins奶牛——已经落了到“垃圾井”中。“垃圾井”是农夫们扔垃圾的地方,它的深度为D (2 <= D <= 100)英尺。卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。假设卡门预先知道了每个垃圾扔下的时间t(0 < t <= 1000),以及每个垃圾堆放的高度h(1 <= h <= 25)和吃进该垃圾能维持生命的时间f(1 <= f <= 30),要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续10小时的能量,如果卡门10小时内没有进食,卡门就将饿死。
Input
本题有多组测试数据. 第一行为2个整数,D 和 G (1 <= G <= 100),G为被投入井的垃圾的数量。第二到第G+1行每行包括3个整数:T (0 < T <= 1000),表示垃圾被投进井中的时间;F (1 <= F <= 30),表示该垃圾能维持卡门生命的时间;和 H (1 <= H <= 25),该垃圾能垫高的高度。
Output
如果卡门可以爬出陷阱,输出一个整表示最早什么时候可以爬出;否则输出卡门最长可以存活多长时间。
Sample Input
20 4
5 4 9
9 3 2
12 6 10
13 1 1
Sample Output
13
来源:编程爱好者
package co_javaapplicationtest; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List; /** * * @author frostbelt */ public class Main { static List<rubbish> list=new ArrayList<rubbish>(); int depth; static int life=10; int countRub; /** * @param args the command line arguments */ public Main(){ init(); while(!this.canGetOut()){ this.eatOneRub(); } } public boolean canGetOut(){ int hight=0; for(int i=0;i<list.size();i++){ if(list.get(i).time<=life){ hight+=list.get(i).hight; if(hight>=depth){ System.out.println("母牛在"+list.get(i).time+"小时可爬出。"); return true; } }else{ break; } } return false; } public void eatOneRub(){ if(list.isEmpty()){ System.out.println("母牛在"+life+"小时后饿死了。"); System.exit(0); } int toBeEatn=-1; double maxFit=0.0; for(int i=0;i<list.size();i++){ if(list.get(i).time<=life){ //System.out.println(((double)list.get(i).food)/list.get(i).hight); if(((double)list.get(i).food)/list.get(i).hight>maxFit){ maxFit=((double)list.get(i).food)/list.get(i).hight; toBeEatn=i; } }else{ break; } } if(toBeEatn==-1){ System.out.println("母牛在"+life+"小时后饿死了。"); System.exit(0); }else{ life+=list.get(toBeEatn).food; System.out.println("母牛吃掉了"+list.get(toBeEatn).time+"小时掉进来的垃圾,它能撑"+life+"个小时"); list.remove(toBeEatn); } } public static void main(String[] args) { // TODO code application logic here new Main(); } public void init(){ this.dealWithFileByLine("src/co_javaapplicationtest/datafile"); } //从文件读取,初始化一些值 public String dealWithFileByLine(String fileName){ String str=null; try{ FileReader f=new FileReader(fileName); BufferedReader ff=new BufferedReader(f); str=ff.readLine(); String[] depthAndCount=str.split(" "); this.depth=Integer.valueOf(depthAndCount[0]); this.countRub=Integer.valueOf(depthAndCount[1]); while(ff.ready()){ str=ff.readLine(); String[] oneLine=str.split(" "); rubbish oneRub=new rubbish(Integer.valueOf(oneLine[0]),Integer.valueOf(oneLine[1]),Integer.valueOf(oneLine[2])); list.add(oneRub); } }catch(Exception e) { e.printStackTrace(); } return str; } //**************************************************************************** } class rubbish{ public int time; public int food; public int hight; public rubbish(int time,int food,int hight){ this.time=time; this.food=food; this.hight=hight; } }
程序中用到的数据文件src/co_javaapplicationtest/datafile内容如下:
20 4 5 4 9 9 3 2 12 6 10 13 1 1
输出结果:
母牛吃掉了9小时掉进来的垃圾,它能撑13个小时 母牛在13小时可爬出。
评论:
在选择吃掉哪个垃圾时,只是选择了F/H性价比最高的,但这不一定是最优的解,如数据:
20 3 1 1000 18 5 1 1 11 2 2
显然应该吃掉5小时掉进来的食物,虽然它只能维持1小时
此题何解?期待高手路过