河北大学太阳风暴

python123太阳风暴

innum=input()#输入第一行内容
innum=innum.split(' ',2)#将输入内容分割
n=int(innum[0])
s=int(innum[1])
k=int(innum[2])

innum=input()#输入第二行内容
innum=innum.split(' ',n-2)
d=[0 for i in range(n-1)]#初始化一个数组保存各点间距离
d_sum=[0 for i in range(n)]#初始化一个数组保存节点到头的总距离
for i in range(n-1):
    d[i]=int(innum[i])
    for j in range(i+1):
        d_sum[i+1]=d[j]+d_sum[i]

innum=input()#输入第三行
innum=innum.split(' ',n-1)
v=[0 for i in range(n)]#初始化数组保存个点价值
for i in range(n):
    v[i]=int(innum[i])

#以下为算法部分

#定义类保存每个方法的数据,包括:价值、护盾数量、节点位置
class weys_to_try:
    def __init__(self,worth,s_num,p_num):
        self.worth=worth    #总价值
        self.s_num=s_num    #护盾数量
        self.p_num=p_num    #被保护节点数量
        self.prpoints=[0 for _ in range(p_num)] #被保护的节点位置
        self.points=[0 for _ in range(s_num)]   #节点位置

    def getworth(self):
        w=0
        for i in range(self.p_num):
            w+=v[self.prpoints[i]-1]
        return w
    
        

allweys=[weys_to_try(0,0,0) for _ in range(n)]
endwey=weys_to_try(0,0,0)

for i in range(n):
    Awey=weys_to_try(0,1,1)
    snum=1
    Awey.points[0]=i+1
    for j in range(n-i-1):
        if d_sum[i+j]-d_sum[Awey.points[-1]-1]<=k:
            None
        elif snum>=s:
            break
        else:
            snum+=1
            Awey.s_num+=1
            Awey.points.append(i+j+1)
    flag=Awey.points[0]
    flag_s=flag
    h=flag
    while flag!=1:
        if k>=d_sum[flag_s-1]-d_sum[flag-1-1]:
            h=flag-1
            flag-=1
        else:
            break
    flag=Awey.points[-1]
    flag_s=flag
    l=flag
    while flag!=n:
        if k>=d_sum[flag]-d_sum[flag_s-1]:
            l=flag+1
            flag+=1
        else:
            break
    Awey.p_num=l-h+1
    Awey.prpoints=[_ for _ in range(h,l+1)]
    Awey.worth=Awey.getworth()
    allweys[i]=Awey
endwey=allweys[0]
for w in allweys:
    if endwey.worth<w.worth:
        endwey=w
    elif endwey.worth==w.worth and endwey.s_num>w.s_num:
        endwey=w

print(endwey.s_num)
for i in range(endwey.s_num-1):
    print(endwey.points[i],end=' ')
print(endwey.points[-1])

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叶隐归根

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

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

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

打赏作者

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

抵扣说明:

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

余额充值