较复杂算法设计-电力供应

题目描述
某个地区的电力供应突然中断,某工厂暂时陷入了瘫痪。为了避免停工造成的损失,工厂决定调用备用发电机临时供电。已知工厂中共有𝑛条不同规格的生产线,分别至少需要𝑊𝑘的功率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) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值