Python:每日一题之防御力(贪心思想)

题目描述

小张最近在玩一款游戏。对游戏中的防御力很感兴趣。

我们认为直接影响防御的参数为"防御性能",记作 d ,而面板上有两个防御值 A 和 B ,与 d 成对数关系,A=2d,B=3d(注意任何时候上式都成立)。

在游戏过程中,可能有一些道具把防御值 A 增加一个值,有另一些道具把防御值 B 增加一个值。

现在小张身上有 n1​ 个道具增加 A 的值和 n2​ 个道具增加 B 的值,增加量已知。

现在已知第 i 次使用的道具是增加 A 还是增加 B 的值,但具体使用那个道具是不确定的,请找到一个字典序最小的使用道具的方式,使得最终的防御性能最大。

初始时防御性能为 0,即 d=0,所以 A=B=1。

输入描述

输入的第一行包含两个数 n1,n2,空格分隔。

第二行 n1 个数,表示增加 A 值的那些道具的增加量。

第三行 n2 个数,表示增加 B 值的那些道具的增加量。

第四行一个长度为 n1+n2 的字符串,由 0 和 1 组成,表示道具的使用顺序。0 表示使用增加 A 值的道具,1 表示使用增加 B 值的道具。输入数据保证恰好有 n1 个 0,n2 个 1 。

其中,字符串长度 ≤2×106,输入的每个增加值不超过 230。

输出描述

对于每组数据,输出 n1​+n2​+1 行。

前 n1​+n2​ 行按顺序输出道具的使用情况,若使用增加A 值的道具,输出 Ax,x 为道具在该类道具中的编号(从 1 开始)。若使用增加 B 值的道具则输出 Bx。

最后一行输出一个大写字母 E 。

输入输出样例

输入

1 2
4
2 8
101

输出

B2
A1
B1
E

 思路:

操作
初始A=1、B=1、d=0
B2B=1+8=9根据B=3^d,算出d=2根据d=2和A=2^d,算出A =4
A1A=4+4=8根据A=2^d,算出d=3根据d=3和B=3^d,算出B =27
B1B=27+2=29根据B=3^d,算出d=log3^29根据d=log3^29,算出A =2^log3^29

        A使B增加快,越大的A对B越有利:A的道具从小到大,后面更大的A更有利于B
        B使A增加慢:B的道具从大到小,前面更大的B对A影响小 

        对Ai进行结构体排序,先对Ai按增加量的从小到大排序,再按下标(字典序)排序。

        对Bi进行结构体排序,先对Bi按增加量的从大到小排序,再按下标(字典序)排序。

        然后按题目要求的顺序,输出Ai和Bi。

参考代码:

n1,n2=map(int,input().split())  
a=list(map(int,input().split()))  #读入A 道具增加量
b=list(map(int,input().split()))  #读入B 道具增加量
for i in range(n1):   #加上序号a[i+1][i]
  a[i]=(i+1,a[i])   
for i in range(n2):   #加上序号
  b[i]=(i+1,b[i])
a.sort(key=lambda x:x[1])   #从小到大对增加量进行排序
b.sort(key=lambda x:x[1],reverse=True)  #从大到小对增加量进行排序
s=input()  #读入字符串
a1=0  
b1=0
for i in range(n1+n2):
  if s[i]=="0":
    print('A%d'%a[a1][0])
    a1+=1
  else:
    print('B%d'%b[b1][0])
    b1+=1
print('E')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力的敲码工

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

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

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

打赏作者

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

抵扣说明:

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

余额充值