【LEETCODE】【鱼缸难题】

【LEETCODE】【鱼缸难题】


题目描述
最近小华买了n条金鱼,小华想买一些鱼缸去装他们,商店有两种鱼缸
第一种:每个鱼缸价格是c1元,可以装n1条鱼
第二种:每个鱼缸价格是c2元,可以装n2条鱼
小华想要把所有的鱼都养在买的那些鱼缸中,而且每个鱼缸都要装满鱼,小华很难计算出两种鱼缸各买多少个最实惠(总花费最少),请你使用程序帮小华计算出最实惠方案。

解答要求
时间限制:1000ms, 内存限制:100MB
输入
每个用例包含三行
第一行为整数n
第二行为c1,n1
第三行为c2,n2
所有数的范围均为[1,2000000000]

输出
每个用例占一行,对于不存在解的情况请输出”failed”(即不能满足所有的鱼都被装在鱼缸中且每个鱼缸都装满)
否则,请输出两个整数m1,m2表示第一种鱼缸买m1个,第二种鱼缸买m2个。保证解是唯一的。

样例
输入样例 1 复制

43
1 3
2 4
输出样例 1

13 1
提示样例 1

提示
解题报告:
显然问题是二元一次不定方程m1n1+m2n2=n的整数解。又有,要求总费用最小,那么,如果c1/n1比c2/n2要小,显然,我们应该让n1尽可能大。反之,让n2尽可能大。
求解该方程使用“扩展欧几里得”算法就可以了。

public static void main(String[] args) {
        // please define the JAVA input here. For example: Scanner s = new Scanner(System.in);
        Scanner s = new Scanner(System.in);
        long n = s.nextLong();
        long c1 = s.nextLong();
        long n1 = s.nextLong();
        long c2 = s.nextLong();
        long n2 = s.nextLong();
        if (n1 > n || n2 > n){
            System.out.println("failed");
        }
        long x = 0;
        long y = 0;
        long min = Long.MAX_VALUE;
        for (long i = 0; i< n/n1+1; i++){
            for (long j=0;j<n/n2+1;j++){
                if (i*n1+j*n2==n && min > i*c1+j*c2){
                    x = i;
                    y = j;
                    min = i*c1+j*c2;
                }else if (i*n1+j*n2<n){
                    continue;
                }else if (i*n1+j*n2>n){
                    break;
                }
            }
        }
        if (x==0 && y==0){
            System.out.println("failed");
        }else{
            System.out.println(x+" "+y);
        }
        // please finish the function body here.
        // please define the JAVA output here. For example: System.out.println(s.nextInt());
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值