题目描述
某个地区的电力供应突然中断,某工厂暂时陷入了瘫痪。为了避免停工造成的损失,工厂决定调用备用发电机临时供电。已知工厂中共有𝑛条不同规格的生产线,分别至少需要𝑊𝑘的功率1 ≤ 𝑘 ≤ 𝑛。同一条生产线同时只能通过一台发电机进行供电。首批调用的备用发电机有𝑚台,每台最多能够提供𝑤𝑘的功率(1 ≤ 𝑘 ≤ 𝑚)。请你帮忙计算首批最多能够给多少条生产线进行供电。
输入
共(n + m + 2)行。 第一行为一个正整数 n,为生产线的数量。 接下来 n 行为 n 个正整数,为各条生产线正常运转所需的功率。 第(n + 2)行为一个正整数 m,为发电机的数量。 接下来 m 行为 m 个正整数,为各台发电机最多能提供的功率。 数据范围:1 <= n <= 50,1 <= m <= 50。
输出
输出包含一个正整数,为最多能进行供电的生产线数量。
方法1
这道题比较关键的问题就在于“同一条生产线同时只能通过一台发电机进行供电”,那么判断能否供电时最好先对列表进行排序,让小功率的发电机先匹配需求小的生产线,这样才能实现数量最大
这道题用的都是基本语法,唯一需要理解的地方就是b[j] = 0、a[i] = 100这个操作。这是因为在此时发电机的功率可以满足生产线的需要,已经匹配完毕,那么在接下来的循环中就不想让发电机继续去匹配。根据wk和m、n的范围,只要让a[i]是一个大于50的数就可以了。
如果不进行这步操作,比如说在电力需求为[1,2,3],i的取值也就是1,2,3,电力供给为[2,4],也就是j的取值时,最后可以供电的数量会显示为5,因为功率为2的发电机匹配了两次,功率为4的发电机匹配了三次,而这不符合题目要求。
#输入数据
n = int(input())
a = []
b = []
ans = 1
while ans <= n:
a.append(int(input()))
ans = ans + 1
m = int(input())
ans1 = 1
while ans1 <= m:
b.append(int(input()))
ans1 = ans1 + 1
#处理数据
a.sort()
b.sort()
r = 0
for i in range(n):
for j in range(m):
if b[j] >= a[i]:
r = r + 1
#下面的操作是让已经匹配完了的数据不要在循环中再次匹配
b[j] = 0
a[i] = 100
print(r)
方法2
在这里也可以用贪心法,while循环进行实现,while循环进行实现时从功率最低的发电机开始,按照生产线所需功率从 小到大尝试给生产线供电 ,while (i < len(lines) and j < len(powers)):
1) 若当前生产线所需功率<=当前发电机能提供的功率,则答案+1;
2)发电机的编号j加1,继续while循环,准备比较下一台发电机
n = int(input())
lines = [int(input()) for i in range(n)]
m = int(input())
powers = [int(input()) for i in range(m)]
# 计算,从小功率的发电机开始尝试 #(1)按升序排序生产线正常运转所需的功率W和各台发电机最多能提供的功率
lines.sort()
powers.sort()
while (i < len(lines) and j<len(powers)):
if lines[i] <= powers[j]: #如果生产线所需功率<=发电机能提供的功率
i += 1 #则能进行供电的生产线数量加1
j += 1 #比较下一台发电机
print(i)