zoukankan      html  css  js  c++  java
  • 垃圾陷阱

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

    此题何解?期待高手路过

  • 相关阅读:
    Python的17种骚操作
    Python使用pip下载慢的原因
    Mysql数据库的安装
    Python中遇到的难解的提示:
    Linux使用SecureCRT远程终端工具的使用
    Linux下IP命令使用详解
    (未解决)jmeter报错之“请在微信客户端打开链接”
    Python学习笔记系列——九九乘法表&猜大小
    《Mysql必知必会》笔记
    (未解决)记录一次登录&jmeter,留下的一地鸡毛
  • 原文地址:https://www.cnblogs.com/frostbelt/p/2066092.html
Copyright © 2011-2022 走看看