思路:
枚举 二技能的使用次数
然后根据二技能的使用次数得出两只怪兽的剩余血量
然后再除以1 技能的伤害 (向上取整)
因为你的剩余血量只有小于等于0 才算击败野怪
我按照这个思路写,结果发现向上取整函数好像没有使用正确
每次的sum 好像都没有向上取整
错误代码
package Lanqiao1;
import java.util.Scanner;
public class 小红杀怪 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
// 两只怪兽的血量
int a = in.nextInt();
int b= in.nextInt();
// 两个技能的伤害
int x = in.nextInt();
int y =in.nextInt();
// 假设 使用二技能 k次
// 那么剩余的使用 一技能的次数就是
int sum =0;
int min =Integer.MAX_VALUE;
for(int k = 0; k<=20; k++) {
sum = k;
// 使用1技能的剩余次数等于
// 怪兽a 剩余血量 除以 一技能的伤害,向上取整
sum += Math.ceil( (a - k * y)/x );
// System.out.print("sum1:"+sum);
// 怪兽b 剩余血量 除以 一技能的伤害,向上取整
sum += Math.ceil( (b - k * y)/x );
// System.out.print("sum2:"+sum);
// 求使用技能次数的最小值
System.out.println(sum);
min =Math.min(min, sum);
}
System.out.println(min);
in.close();
}
}
原因在于我括号的内部是整数的除法
,整数的出发是向下取整 ,
应该先转换成double 类型 才能实现向上取整 再转化为int
这是修改的地方
// 使用1技能的剩余次数等于
// 怪兽a 剩余血量 除以 一技能的伤害,向上取整
sum += Math.ceil( ( (double)a - k * y)/x );
// (double)
// System.out.print("sum1:"+sum);
// 怪兽b 剩余血量 除以 一技能的伤害,向上取整
sum += Math.ceil( ( (double)b - k * y)/x );
修改之后的运行结果
emm还是不对
视频上说向上取整是这样
ok,继续改
我发现自己忽略了一个点 就是如果 怪兽血量都是负数了,还加到次数里面有问题
所以需要新增一个判断剩余血量的 如果剩余血量>0 才能使用1 技能
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
// 两只怪兽的血量
int a = in.nextInt();
int b= in.nextInt();
// 两个技能的伤害
int x = in.nextInt();
int y =in.nextInt();
// 假设 使用二技能 k次
// 那么剩余的使用 一技能的次数就是
int sum =0;
int min =20;
for(int k = 0; k<=20; k++) {
sum = k;
// 使用1技能的剩余次数等于
// 怪兽a 剩余血量 除以 一技能的伤害,向上取整
if(a-k*y>0)
sum += Math.ceil( (a - k * y+x-1)/x );
// (double)
// System.out.print("sum1:"+sum);
// 怪兽b 剩余血量 除以 一技能的伤害,向上取整
// 避免负数的影响
if(b-k*y>0)
sum += Math.ceil( (b - k * y+x-1)/x );
// double)
// System.out.print("sum2:"+sum);
// 求使用技能次数的最小值
// System.out.println(sum);
min =Math.min(min, sum);
}
System.out.println(min);
in.close();
}
}