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小时
此题何解?期待高手路过