垃圾陷阱

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小时

此题何解?期待高手路过

posted @ 2011-06-01 15:22  xngeer  阅读(640)  评论(0编辑  收藏  举报