1088 三人行 (20 分)
题意描述:
子曰:“三人行,必有我师焉。择其善者而从之,其不善者而改之。”
本题给定甲、乙、丙三个人的能力值关系为:甲的能力值确定是 2 位正整数;把甲的能力值的 2 个数字调换位置就是乙的能力值;甲乙两人能力差是丙的能力值的 X 倍;乙的能力值是丙的 Y 倍。请你指出谁比你强应“从之”,谁比你弱应“改之”。
输入格式:
输入在一行中给出三个数,依次为:M(你自己的能力值)、X 和 Y。三个数字均为不超过 1000 的正整数。
输出格式:
在一行中首先输出甲的能力值,随后依次输出甲、乙、丙三人与你的关系:如果其比你强,输出 Cong;平等则输出 Ping;比你弱则输出 Gai。其间以 1 个空格分隔,行首尾不得有多余空格。
注意:如果解不唯一,则以甲的最大解为准进行判断;如果解不存在,则输出 No Solution。
输入样例 1:
48 3 7
输出样例 1:
48 Ping Cong Gai
输入样例 2:
48 11 6
输出样例 2:
No Solution
解题思路:
Alice: M 的能力值是不是和甲乙丙的能力值无关啊,你看样例1中M的能力值刚好等于甲的能力值。
Bob: 是无关的,
依次输出甲、乙、丙三人与你的关系
Alice: 那就是从99 到 10 搜索甲的能力值了,只要找到了满足 题目要求的就输出。如果循环结束也没有找到就是‘No Solution’
Bob: 还有一件事,丙的能力值可能是浮点数!!
Alice: 你怎么知道,我还认为如果 乙的能力值不能整除 Y 就是无解呢。
Bob: 我试过啦,测试点4就是专门卡这个丙的能力值是浮点数的情况的。我和你想的一样啊,结果错了好多次。Ծ‸Ծ
Alice: emmm, 甲乙两人能力差是丙的能力值的 X 倍;乙的能力值是丙的 Y 倍 ,只是倍数关系啊,丙的能力值是整数还是浮点数还真的没有说诶。
Bob: 你用代码试试就知道了,估计这点坑到很多人。
代码:
- A’s Python Version:
def main():
M, X, Y = (int(x) for x in input().split())
answer = 'No Solution'
# 先假设没有答案
compare = ['Ping', 'Gai', 'Cong']
# 待会用M 与甲乙丙三人的能力值制造对应的下标
for a in range(99, 9, -1):
# 甲就是a,从99到10尝试各种可能
flag, b, c = check(a, X, Y)
if flag:
# 找到第一个答案
answer = "{} {} {} {}".format(a, compare[get_index(M, a)], compare[
get_index(M, b)], compare[get_index(M, c)])
break
# 只需要一个甲取值最大的就可以了,记得break出去
print(answer)
# 输出答案
def get_index(a, b):
# 根据 M 和 甲乙丙的大小关系计算下标
if a == b:
# 对应compare[0] == 'Ping'
return 0
else:
# 对应compare[-1] == 'Gai' 和 compare[1] == 'Cong'
return int((a - b) / abs(a - b))
def check(a, X, Y):
# 判断 甲是a时,是否满足条件。
b = float(str(a)[::-1])
c = b / Y
# c 可能是一个浮点数,本题的一个坑点。
if abs(a - b) == X * c:
return (True, b, c)
else:
return (False, 0, 0)
if __name__ == '__main__':
main()
易错点:
- 丙的能力值可能是浮点数,如果用C/C++语言最好用double存储,以防精度不够(测试点 4)。
总结:
-