- wa#4 注意,题目中这句话----n是正整数,因此l = 1,而不是0,这是wa#4的原因
2.wa#10,11,17 - 20的原因
这题对于n没有明确说明范围,实际上是LLONG_MAX,同时,这说明还得开long long
3.开了long long发现wa#3,4
注意,别用l + r >> 1,这会越界,并且,这实际上是不等同于 / 2,是需要考虑符号位的
4.对于啥时候输出-1
注意,这个解题数是必须 = k的!!,不要被二分后的ans = mid迷惑,ans是代表n的范围,和 解题数没有任何关系,你需要的是,注意,把check函数return的值改成int,只有当 解题数= k的时候return一个特定值,此时才 ans = mid ,看不懂? 那就看代码!
int ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
int t = check(mid);
if (t) {
if (t == 2)
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
因此,判定是否无答案就是 ans 是否 等于-1
5.如果还是错,就说明是二分答案模板有问题
本题在找最小答案的时候,应该是
r = mid - 1,让r向左移,这样才能找到第一个符合答案的最小值
找最大答案就是l = mid + 1,让l向右走,找最后一个符合答案的最大值