题目
链接:P10387 [蓝桥杯 2024 省 A] 训练士兵 - 洛谷
注意细节:第一行是n和S,然后是“接下来的n行”,这n行士兵,分别是金币数和次数
思路
发现说,一般来说是团购价格<单独训练价格,是尽可能先团购,再单独训练
贪心+排序的思路,先贪心,找到最大团购次数,然后剩下的再单独训练
代码
n,S=map(int,input().split())
lst=[]
for i in range(n):
p,c=map(int,input().split())
lst.append([p,c])
lst.sort(key=lambda x:x[1]) # 默认升序
num=lst[0][1]
pri=num*S # 团购次数*价钱
for j in range(1,n):
pri+=lst[j][0]*(lst[j][1]-num)
print(pri)
反思
- 看懂题目
- 组团训练 VS 单独训练
- 输入格式。第一行为n和S,n为成员数,S为组团训练价钱;接下来n行是p和c,即单次价钱和训练次数
- 理清思路
- 当人数充足时,团体训练更为划算,所以我们要优先团体训练,剩下再单独训练
- 代码如何输入数据
- `a,b=map(int,input().split())`-->表示输入时为两个数,用空格间隔{map表示映射,输入的为int类型,input输入,split分割,默认空格分割},分别赋值给a和b
- 注意看看清楚,一定是先读取n和S,再根据n,决定后面需要输入多少次
- 掌握排序
- 我输入p和c时,使用多次循环,每次循环中为[p,c],再使用append加入列表
- 在分析是我们知道,要确定最大团购数->最小训练数,此时我们要对每个列表的第二个元素进行排序,所以要确定排序规则key,`lst.sort(key=lambda x:x[1])`,默认是升序