[语言月赛 202407] true 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求根据看到的第一个、第二个属性的值(分别被放大了 10 倍和缩小了 10 倍),求出三个属性的真实值,且三者之和正好为 10000。核心解法是先由放大/缩小关系还原前两个属性的真实值,再用总和 10000 减去它们得到第三个属性。

分析
核心观察

第一个属性被放大了 10 倍,所以看到的 a 是真实值的 10 倍,真实值为 a/10;第二个属性被缩小了 10 倍,所以看到的 b 是真实值的 1/10,真实值为 10b;第三个属性由总和 10000 减去前两者得到。

思路

设三个真实属性分别为 x, y, z。由题意:

\displaystyle  x = \frac{a}{10}, \qquad y = 10b, \qquad z = 10000 - x - y

代入 x, y 可得:

\displaystyle  z = 10000 - \frac{a}{10} - 10b

数据范围保证 a 是 10 的倍数,因此 x, y, z 均为整数。

具体示例

以样例 1 为例:a = 40000,b = 300,则 x = 40000 / 10 = 4000,y = 10 \times 300 = 3000,z = 10000 - 4000 - 3000 = 3000,输出 4000、3000、3000,与样例一致。

算法步骤
  1. 读入两个整数 a、b。
  2. 计算第一个真实属性 x 为 a / 10。
  3. 计算第二个真实属性 y 为 10 \times b。
  4. 计算第三个真实属性 z 为 10000 - x - y。
  5. 依次输出 x、y、z。
复杂度分析

时间:O(1)

空间:O(1)

实现注意事项
  • a 保证是 10 的倍数,a / 10 一定为整数,可直接使用整数除法。
  • 所有数值均在 int 范围内:a \le 100000、b \le 1000,且题目保证结果没有负数。
  • 输出顺序为第一个、第二个、第三个属性,注意与题意顺序一致。
源代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int x = a / 10;
    int y = b * 10;
    int z = 10000 - x - y;
    cout << x << ' ' << y << ' ' << z << '\n';
    return 0;
}
a, b = map(int, input().split())
x = a // 10
y = b * 10
z = 10000 - x - y
print(x, y, z)

评论

目前没有评论。