题目
题目链接
解题思路
- 题目本质是要找出在给定范围内,妹妹最多能错误报告多少次才能被牛牛识破
- 假设妹妹想的两个数之和为 \(y\),那么:
- 实际数字最大不能超过 \(y-1\)(因为需要两个不相等的正整数)
- 牛牛猜的数字不能超过 \(x\)
- 妹妹每次报告"猜错了"时,牛牛实际上已经猜对了
- 当牛牛猜到 \(y/2+1\) 时,一定能判断出妹妹在说谎(因为剩下的数不可能构成和为 \(y\))
- 因此,最多能错误报告的次数就是:\(\min(x, y-1) - (y/2+1) + 1\)
代码
#include <iostream>
using namespace std;
int main() {
long long x, y;
cin >> x >> y;
long long n = y / 2 + 1;
x = x > y - 1 ? y - 1 : x;
long long ret = x - n;
cout << (ret < 0 ? 0 : ret + 1) << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long x = sc.nextLong();
long y = sc.nextLong();
long n = y / 2 + 1;
x = Math.min(x, y - 1);
long ret = x - n;
System.out.println(ret < 0 ? 0 : ret + 1);
}
}
x, y = map(int, input().split())
n = y // 2 + 1
x = min(x, y - 1)
ret = x - n
print(0 if ret < 0 else ret + 1)
算法及复杂度
- 算法:数学推导
- 时间复杂度:\(\mathcal{O}(1)\) - 只需要简单的数学计算
- 空间复杂度:\(\mathcal{O}(1)\) - 只使用常数额外空间