题解:洛谷 AT_abc465_a Supermajority
【题目来源】
洛谷:AT_abc465_a [ABC465A] Supermajority
【题目描述】
给定正整数 \(A\) 和 \(B\)。
如果 \(A > B \times \frac{2}{3}\),输出 Yes;否则,输出 No。
【输入】
输入由标准输入给出,格式如下:
\(A\) \(B\)
【输出】
输出答案。
【输入样例】
316 465
【输出样例】
Yes
【核心思想】
-
问题分析:给定正整数 \(A\) 和 \(B\),判断 \(A > B \times \frac{2}{3}\) 是否成立。这是一个整数比较 + 浮点避免问题,核心在于将分数不等式转化为整数乘法比较,消除浮点精度风险。
-
算法选择:
- 不等式变形:\(A > B \times \frac{2}{3} \Leftrightarrow 3A > 2B\),通过交叉相乘将除法转化为乘法
-
关键步骤:
- 读入数据:读取 \(A, B\)
- 整数比较:若 \(3 \times A > 2 \times B\),输出
Yes;否则输出No
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\)
- 空间复杂度:\(O(1)\)
-
整数运算防浮点误差的核心思想:
- 交叉相乘等价变换:\(A > \frac{2B}{3} \Leftrightarrow 3A > 2B\),两边同乘分母 \(3\) 消去分数,完全避免浮点运算
- 精度保证:整数乘法精确无误,而浮点除法 \(B \times 2.0 / 3.0\) 可能因精度问题导致边界判断错误
- 边界安全:即使 \(3A = 2B\)(恰好相等),整数比较也能正确判定为
No,符合严格大于的要求 - 适用于基础不等式判定、浮点精度敏感类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int a, b; // a, b: 输入的两个正整数
int main()
{
cin >> a >> b; // 读入两个正整数 A 和 B
if (3 * a > b * 2) // 判断 A > B * 2/3,等价于 3A > 2B(避免浮点运算)
cout << "Yes" << endl; // 条件成立,输出 Yes
else
cout << "No" << endl; // 条件不成立,输出 No
return 0;
}
【运行结果】
316 465
Yes
浙公网安备 33010602011771号