牛客-游游的水果大礼包

1.题目描述

牛客-游游的水果大礼包_第1张图片

2.题目链接

游游的水果大礼包_牛客题霸_牛客网 

3.代码解答

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long n=in.nextInt();
        long m=in.nextInt();
        long a=in.nextInt();
        long b=in.nextInt();
        long ret=0;
        for(long x=0;x<=Math.min(n/2,m);x++){
            long y=Math.min(n-2*x,(m-x)/2);
            ret=Math.max(ret,a*x+b*y);
        }
        System.out.println(ret);
    }
}

4.解题思路 

礼包序号 苹果:共n个 桃:共m个 价值 礼包数量
1 2 1 a x
2 1 2 b y

1)x的取值范围、y和x的表达式 

我们可以以极端的思想来思考,当我们只考虑礼包1的时候:

如果我们只考虑苹果,每个礼包2个苹果,一共有n个苹果,礼包1的数量x就是n/2;

如果我们只考虑桃子,每个礼包1个桃子,一共有m个桃子,礼包1的数量就是m;

因为木桶效应(短板理论),x要取这两个值的最小值。即x的最大值是Math.min(n/2,m);

同样滴,当我们只考虑礼包2的时候:

如果我们只考虑苹果,每个2号礼包1个苹果,一共有n个苹果,礼包1的数量是x,礼包2的数量是y,也就是2*x+y*1=n,y=n-2*x;

如果我们只考虑桃子,每个2号礼包2个桃子,一共有m个桃子,礼包1的数量是x,礼包2的数量是y,也就是x*1+y*2=m;y=(m-x)/2;

同样因为木桶效应,y要取这两个值的最小值。

2)枚举

当我们碰到题目中可以推断出来x的取值范围、y和x又可以推断出表达式的时候,我们可以采用枚举的方法,依次枚举x,然后得到这种情况的y的取值,结果总价值ret就是x*a+y*b。

5.代码细节

1)int类型超时的问题

long n = in.nextInt();
            long m = in.nextInt();
            long a = in.nextInt();
            long b = in.nextInt();
            long ret=0;

题目中并未明确限制 nmab 的范围,但在算法题中,这类参数的上限通常可能达到 10^9 甚至更高。即使 x 和 y 单独看在 int 范围内,它们与 ab 的乘积也可能溢出。因为需要定义为long类型。

你可能感兴趣的:(OJ算法题题目心得,动态规划,算法)