问题描述
小蓝要去健身,他可以在接下来的
1
∼
𝑛
1∼n 天中选择一些日子去健身。
他有 𝑚 m 个健身计划,对于第 𝑖 i 个健身计划,需要连续的 2 𝑘 𝑖 2 k i
天,如果成功完成,可以获得健身增益 𝑠 𝑖 s i ,如果中断,得不到任何增益。
同一个健身计划可以多次完成,也能多次获得健身增益,但是同一天不能同时进行两个或两个以上的健身计划。
但是他的日程表中有 𝑞 q 天有其他安排,不能去健身,问如何安排健身计划,可以使得 𝑛 n 天的健身增益和最大。
输入格式 第一行输入三个整数 𝑛 , 𝑚 , 𝑞 n,m,q 。
第二行输入 𝑞 q 个整数, 𝑡 1 , 𝑡 2 , 𝑡 3 . . . 𝑡 𝑞 t 1 ,t 2 ,t 3 ...t q ,代表有其他安排的日期。
接下来 m 行,每行输入两个整数 𝑘 𝑖 , 𝑠 𝑖 k i ,s i 。代表该训练计划需要 2 𝑘 𝑖 2 k i
天,完成后可以获得 𝑠 𝑖 s i 的健身增益。
输出格式 一个整数,代表最大的健身增益和。
n,m,q=map(int,input().split())
cant_use=list(map(int,input().split()))
vis=[0]*(n+1)
for x in cant_use:
vis[x]+=1
for i in range(1,n+1):
vis[i]+=vis[i-1]
sw=[0]*40
for _ in range(m):
k,s=map(int,input().split())
sw[k]=max(sw[k],s)
dp=[0]*(n+1)
for i in range(1,n+1):
dp[i]=dp[i-1]
for k in range(21):
l=i-(1<<k)
if l>=0 and vis[i]-vis[l]==0:
dp[i]=max(dp[i],dp[l]+sw[k])
else:
break
print(dp[n])