[编程题] 贪吃的小Q
时间限制:1秒
空间限制:32768K
小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。
输出描述:
输出一个数表示小Q第一天最多能吃多少块巧克力。
输入例子1:
3 7
输出例子1:
4
解题思路:
1.暴力求解,循环查找第一天吃的数量,判断是否满足——会超时;
2.优化:二分查找
3.进一步优化:二分查找里进行sum判断,多于sum就break
package TengXun;
import java.util.Scanner;
public class EatChocolate {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
int total = sc.nextInt();
if (day == total) {
System.out.println(1);
return;
}
int first = 1;
int last = total;
int sum = 0;
int mid = 0;
boolean ok = true;
while (first <= last) {
mid = (first + last) / 2;
// 当第一天为mid时,是否满足
ok = false;
int num = mid;
for (int i = 1; i <= day; i++) {
sum = sum + num;
if (sum > total) {// 优化部分
ok = true;
break;
}
num = (int) Math.ceil((double) num / 2);
}
// 根据结果,进行调整
if (ok) {
last = mid - 1;
} else {
if (sum < total) {
first = mid + 1;
} else if (sum == total) {
break;
}
}
}
System.out.println(mid);
}
}