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 = 1
,da = {1: 1}
。 -
第二次遍历:
i = 2
,da = {1: 1, 2: 1}
。 -
第三次遍历:
i = 2
,da = {1: 1, 2: 2}
。 -
第四次遍历:
i = 3
,da = {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 = 1
,j = 1
:flag1 = 1
。 -
对于
i = 2
,j = 2
:不满足j == 1
或j > 2
,跳过。 -
对于
i = 3
,j = 1
:flag1 = 2
。 -
最终
flag1 = 2
,flag2 = 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 = 2
,flag2 = 0
:-
输出
0 + (2 - 0) // 2 = 1
。
-
-
如果
flag1 = 1
,flag2 = 3
:-
输出
3
。
-
-