题解:洛谷 AT_abc465_a Supermajority

【题目来源】

洛谷:AT_abc465_a [ABC465A] Supermajority

【题目描述】

给定正整数 \(A\)\(B\)

如果 \(A > B \times \frac{2}{3}\),输出 Yes;否则,输出 No

【输入】

输入由标准输入给出,格式如下:

\(A\) \(B\)

【输出】

输出答案。

【输入样例】

316 465

【输出样例】

Yes

【核心思想】

  1. 问题分析:给定正整数 \(A\)\(B\),判断 \(A > B \times \frac{2}{3}\) 是否成立。这是一个整数比较 + 浮点避免问题,核心在于将分数不等式转化为整数乘法比较,消除浮点精度风险。

  2. 算法选择

    • 不等式变形\(A > B \times \frac{2}{3} \Leftrightarrow 3A > 2B\),通过交叉相乘将除法转化为乘法
  3. 关键步骤

    • 读入数据:读取 \(A, B\)
    • 整数比较:若 \(3 \times A > 2 \times B\),输出 Yes;否则输出 No
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\)
    • 空间复杂度:\(O(1)\)
  5. 整数运算防浮点误差的核心思想

    • 交叉相乘等价变换\(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
posted @ 2026-08-26 10:13  团爸讲算法  阅读(3)  评论(0)    收藏  举报