1 条题解

  • 0
    @ 2025-8-24 23:14:11

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_kun
    生命绚烂,别被黑暗压垮。

    搬运于2025-08-24 23:14:11,当前版本为作者最后更新于2025-04-21 19:34:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题解:坤之队的球衣号码

    题目描述

    在篮球之都,有一支由 nn 位球员组成的“坤之队”。他们参加了 mm 场比赛,每场比赛前教练会指定一名队长,并将队长的球衣号码设为 0。其他球员的球衣号码根据与队长的位置关系调整:队长右边的球员号码依次比左边大 1,左边的依次比右边大 1。经过 mm 场比赛后,求每个球员在所有比赛中穿过的最大球衣号码。

    输入格式

    • 第一行:两个整数 nnmm,表示球员数量和比赛场数。
    • 第二行:mm 个整数,表示每场比赛的队长编号。

    输出格式

    • 一行 nn 个整数,表示每个球员在所有比赛中的最大球衣号码。

    解题思路

    1. 球衣号码规律:对于队长编号 pp,球员 ii 的球衣号码为 ip|i - p|
    2. 最大号码:对于每个球员 ii,队长为 jj 时,其最大球衣号码是所有比赛中 ipj|i - p_j| 的最大值。
    3. 优化:可以通过观察发现,最大球衣号码只与所有队长编号的最小值 mminmmin 和最大值 mmaxmmax 有关。因此,对于每个 ii,其最大球衣号码为 max(immin,immax)max(|i-mmin|,|i-mmax|)

    代码实现

    import sys
    
    def main():
        # 读取 n 和 m
        n, m = map(int, sys.stdin.readline().split())
        # 初始化最大值和最小值
        mmax = -float('inf')
        mmin = float('inf')
        # 读取 m 个队长编号,更新最大值和最小值
        t_list = list(map(int, sys.stdin.readline().split()))
        for t in t_list:
            mmax = max(mmax, t)  # 取最大值
            mmin = min(mmin, t)  # 取最小值
        
        # 根据前面推理得出的公式输出答案
        for i in range(1, n + 1):
            print(max(abs(i - mmin), abs(i - mmax)), end=" ")
    
    if __name__ == "__main__":
        main()
    

    The end.

    • 1

    信息

    ID
    12118
    时间
    3000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者