1088 三人行 (20 分)

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)。

总结:

-result


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值