📜  门|门CS 2011 |第 52 题(1)

📅  最后修改于: 2023-12-03 15:42:22.639000             🧑  作者: Mango

题目介绍

题目编号: 门|门CS 2011 |第 52 题

题目名称: 手机竞价

题目描述:

有 $n$ 个人,$k$ 个手机,每个人对每个手机出价,可能是一个整数,也可能不出价。手机不卖给两个出价一样的人,当然不出价也等于出 $0$ 元,求每个人所得手机的编号,如果他没有得到手机就输出 $0$。

输入格式:

第一行,两个正整数 $n,k$。

接下来 $n$ 行,每行 $k$ 个数,表示该人对这个手机的出价,如果为 $0$ 则表示不出价。

输出格式:

输出 $n$ 行,每行一个数,表示该人所得的手机编号,如果没有得到手机就输出 $0$。

输入样例:

3 3
1 2 3
2 3 1
3 2 0

输出样例:

1
2
3

解题思路

这道题可以使用一种枚举的思想来解决。

枚举每一个手机的出价情况,然后判断是否有人出价高于其他人,如果有,就把这个手机给这个人,记录下编号,然后进行下一轮枚举。

在这个过程中,要注意几个问题:

  • 第一轮枚举所有的手机,把出价最高的人标记为得到手机的人。
  • 如果多人同时出得最高价,就认为一个人是成功获得了这个手机的主人,即多人排名并列。
  • 枚举下一次时,需要将上次的得主标记去除,即排除得主的干扰,重新进行出价。

参考代码

n, k = map(int, input().split())
prices = [list(map(int, input().split())) for i in range(n)]

rank = [0] * k  # 记录手机的得主

# 枚举手机
for i in range(k):
    # 当前手机的得主
    cur_winner = 0
    # 当前手机的最高出价
    cur_max_price = -1

    # 找出当前手机的得主
    for j in range(n):
        if prices[j][i] > cur_max_price:
            cur_max_price = prices[j][i]
            cur_winner = j

    # 标记得主
    rank[i] = cur_winner

# 输出结果
for winner in rank:
    print(winner + 1)

以上为Python3解题代码,将其复制到IDE中即可运行。