三个水杯

三个水杯
时间限制:1000 ms  |  内存限制:65535 KB
难度:4

描述
    给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,
并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。

输入
    第一行一个整数N(0<N<50)表示N组测试数据
    接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
    第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
    每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入

    2
    6 3 1      开始的状态
    4 1 1      最后的状态

    9 3 2
    7 1 1



样例输出

    3

    -1



--------------------------------------------------------------------------------------------------------------------------


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import javax.print.attribute.standard.MediaSize.Other;

/**
 * 思路  将数据先排序  从小到大,每个数据,是否可由最小值出来,如果可,
 * (考虑B[] 里面的数据从小到大是否可以由A[]的数据组成)如果可有,这,可以删除这个数据(从大到小)
 *
 * @author if
 *
 */
class Water{
    private int min=0;  // 最小掉的数据
    private List<Integer> original=new ArrayList<Integer>();   //原来的数据
    private List<Integer> modern=new ArrayList<Integer>();    //要生成的数据
    
    public void StringtoInt(String str){   //将String 变问int[]
        @SuppressWarnings("resource")
        Scanner scan=new Scanner(str);
        for(int i=0;i<str.length()/2;i++){
            if(i<=2)
                original.add(scan.nextInt());                
            else
                modern.add(scan.nextInt());
        }        
        
    //    System.out.println(this.original.toString()+"__原来的数据");
        //System.out.println(this.original.get(1));
    //    System.out.println(this.modern.toString()+"__要生成的数据");
        //System.out.println(this.modern.get(1));
    //    System.out.println("--------------------------------");
    }
    
    public void fun(){   //从数据or 判断书否可以生成 mo,可以,删除数据 mo(最大值开始)     如何判断数据是否有最少的数据组成(方法先从大数据开始,每次尽可能的用到的大数据)
        for(int i=1;i<modern.size();i++){  //从最后生成的数据的第二个开始,然后判断后面的数据,手否可以有original的数据生成,先从original 的数据第二个开始
            int temp=0;//剩下的数据清空
            int begin=modern.get(i);//水杯里的水
            for(int j=1;j<original.size();j++){
                
                temp=begin%original.get(j);
                if(temp==0){
                    if(i!=j)
                        min++;
                    min+=begin/original.get(j);
                    break;//被倒完了
                }
                else{  //没有掉玩
                    min+=begin/original.get(j);
                    if(begin/original.get(j)!=0)
                        min++;
                    begin=temp;//将没有掉完的水放入begin 中,让original 的水杯继续掉
                }
            //    System.out.println(original.get(i)+"_____"+modern.get(j)+"    i   j");
            //    System.out.println("min    "+this.min);
            //    System.out.println();
            }
            if(this.min==0)
                break;//有一个杯子无法装满
            if(original.get(0)<IsAll(modern))
                break;//杯子太多,水少
            
        }
        if(min==0)
            System.out.println(-1);
        else
            System.out.println(this.min);
    }
    
    
    public int IsAll(List<Integer> list){
        int temp=0;
        for(int i:list)
            temp+=i;
        return temp;
    }
    
    
}
public class Water_Pump {
    public static void main(String[] args) {
        //String str=" 6 3 1\n"+"4 1 1";
    //    String str="9 3 2\n"+"5 2 2";
//        String str="9 3 2\n"+" 7 1 1";
        
        String str="9 3 2\n"+" 7 1 2";
                
        Water wa=new Water();        
        wa.StringtoInt(str);
        wa.fun();
        //System.out.println(wa);
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值