问题描述:
烬是一名狙击手,它拥有一把容量为4的狙击枪,在射出最后一发子弹后,他需要k秒的时间来装填弹药
Jhin不能提前填装弹药。在k=1时,如果Jhin在第4秒打出了最后一发子弹,他在第5秒不能射击,但可以在第6秒射击。
Jhin将狙杀看作一门艺术,每当命中一个敌人时, 他都会获得一定的愉悦度。(获得金币)
作为一名艺术家,Jhin特别讲究一个完美的谢幕,弹匣里的最后一发子弹会给予他双倍的愉悦度, 而且,Jhin希望最后他狙杀的最后一个敌人一定是使用的最后一发子弹。
现在,会有n个敌人每秒依次出现在Jhin面前(每个敌人出现1秒,1秒后消失,Jhin可以选择击杀也可以选择不击杀)。你需要告诉Jhin,他能获得的最大愉悦度。
参数:
给一个int[n]数组,每一个元素为第index秒出现的敌人给的愉悦度,以及一个装弹时间k。
头疼点:
假设给的数组是1,2,3,4,5,6,7,8,9;给的k是1,此时最大可以打两组弹,即1-4与6-9,最大愉悦度也是这种情况;
但当给的数组是0,0,0,0,1,0,0,0,0时,虽然仍最大可以打两组弹,但不打index=4的敌人愉悦度就会为0,此时最大愉悦度是只打一组弹药,且保证前三发有一发打中‘1’。
本题的难点在于要确定子弹打的组数,以及要考虑第四发子弹二倍愉悦度,装弹时间不能击杀敌人和最后一个敌人被第四发子弹击杀。
目前能确定的就是,烬一定是打了4的倍数发子弹。(敌人给的愉悦度可以为负数)
有哪位大手子help一下,我这微末道行,实在是一点思路没有。(现在提问怎么什么词都不让用)
二叉暴力算法写的,每一个时间考虑射击与不射击,所以时间复杂度相当高,是2^n,只能跑大概数组长度是30-40的,截图是一个20长度的答案。
import random
list=[]
list1=[]
dict={}
for i in range(20):
list.append(random.randint(-50,50))
print(list)
def find(i,sum,count,end):
if(i==end-1):
if(count==4):
list1.append(sum+list[i]*2)
return True
if(count==5):
count=1
find(i + 1, sum, count, end)
elif(count==4):
find(i + 1, sum, count, end)
sum += list[i]*2
find(i + 1, sum, count + 1, end)
else:
find(i + 1, sum, count, end)
sum+=list[i]
find(i+1,sum,count+1,end)
find(0,0,1,20)
print(sorted(list1,reverse=True))
这些是代码,动态规划应该好解一些
给思路。
首先可以确定最后一发一定是双倍而且最后一个敌人一定会被杀死。
所以往前推可以确定最少有四个敌人的分永远不可能吃到,同理第一个分也一定在四号位之后。
所以会出现以下情况
数组长度<4.,无法完成最后一发给最后一个敌人,无解。
4<数组长度<8,可以满足最后一发子弹给最后一个敌人但是无法开出两发,所以就是最后一个敌人的分数双倍
数组长度>8,可以满足开两发以上。
假设数组长度为n。则设数组为a[n-1],可以确定a[0]-a[2]的分永远不可能吃到,也可以确定a[n-5]-a[n-2]也永远不可能吃到(为了满足最后一发给敌人前三发包括换单时间都无法吃分)
现在就是求a[3]-a[n-6]的最优解。只需要满足两个条件:
第一:最优解和最大
第二:任意两相邻最优解下标差>5(因为开过上一枪下一枪至少要等五秒之后)
最后再加上最后一发的分数即为所求。
暴力算法可以试试深度优先搜索,优化算法还是等大佬老想吧,个人能力有限罒▽罒
https://img-mid.csdnimg.cn/release/static/image/mid/ask/032108128826145.png '图片.png')