17153. 班级活动(蓝桥杯-python)

代码写法

import os
import sys

# 请在此输入您的代码

n = int(input())
a = list(map(int,input().split()))

da = {}
flag1 = 0
flag2 = 0

for i in a:
    da[i] = da.get(i,0)+1


for i,j in da.items():
    if j == 1:
        flag1 +=1
    if j > 2:
        flag2 += j-2

if flag2 > flag1:
    print(flag2)
else:
    print(flag2 + (flag1 - flag2)//2)

代码解释:

1. 导入模块
import os
import sys
  • 这里导入了 os 和 sys 模块,但在这段代码中并没有用到它们。可能是为了后续扩展功能预留的。


2. 输入处理
n = int(input())
a = list(map(int, input().split()))
  • n = int(input())

    • 从标准输入读取一个整数 n,表示同学的总数。

    • 例如,输入 4,则 n = 4

  • a = list(map(int, input().split()))

    • 从标准输入读取一行,将其按空格分割成多个字符串,然后将每个字符串转换为整数,最后存储到列表 a 中。

    • 例如,输入 1 2 2 3,则 a = [1, 2, 2, 3]


3. 统计每个 id 出现的次数
da = {}
for i in a:
    da[i] = da.get(i, 0) + 1
  • da = {}

    • 创建一个空字典 da,用于存储每个 id 及其出现的次数。

  • da.get(i, 0)

    • 获取字典 da 中键为 i 的值。如果键 i 不存在,则返回默认值 0

    • 对字典da初始化为0

  • da[i] = da.get(i, 0) + 1

    • 对当前 id i 的计数加 1,并更新到字典 da 中。

  • 例子

    • 如果 a = [1, 2, 2, 3],则:

      • 第一次遍历:i = 1da = {1: 1}

      • 第二次遍历:i = 2da = {1: 1, 2: 1}

      • 第三次遍历:i = 2da = {1: 1, 2: 2}

      • 第四次遍历:i = 3da = {1: 1, 2: 2, 3: 1}


4. 统计需要修改的次数
flag1 = 0
flag2 = 0
for i, j in da.items():
    if j == 1:
        flag1 += 1
    if j > 2:
        flag2 += j - 2
  • flag1

    • 用于记录出现次数为 1 的 id 的数量。

  • flag2

    • 用于记录出现次数超过 2 的 id 的多余次数。

  • for i, j in da.items()

    • 遍历字典 da 中的每个键值对,i 是 id,j 是该 id 出现的次数。

  • if j == 1

    • 如果某个 id 出现的次数为 1,则 flag1 加 1。

  • if j > 2

    • 如果某个 id 出现的次数超过 2,则 flag2 加上多余的部分(j - 2)。

  • 例子

    • 如果 da = {1: 1, 2: 2, 3: 1}

      • 对于 i = 1j = 1flag1 = 1

      • 对于 i = 2j = 2:不满足 j == 1 或 j > 2,跳过。

      • 对于 i = 3j = 1flag1 = 2

      • 最终 flag1 = 2flag2 = 0


5. 计算最终需要修改的次数
if flag2 > flag1:
    print(flag2)
else:
    print(flag2 + (flag1 - flag2) // 2)
  • if flag2 > flag1

    • 如果 flag2(多余次数)大于 flag1(单独 id 的数量),则直接输出 flag2

    • 因为多余的部分可以直接用来覆盖单独的部分。

  • else

    • 如果 flag2 小于等于 flag1,则需要将 flag2 全部用于覆盖单独的部分,剩下的单独部分需要两两配对修改。

    • 计算方式为:flag2 + (flag1 - flag2) // 2

    • //向下取整

  • 例子

    • 如果 flag1 = 2flag2 = 0

      • 输出 0 + (2 - 0) // 2 = 1

    • 如果 flag1 = 1flag2 = 3

      • 输出 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲中203

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值