请帮我解决问题。在我看来,这项任务很艰巨。说实话,我不知道如何解决。虽然有一个想法可以简单地遍历所有战士的组合,但是数量太多了,所以我必须寻求帮助)给我一个解决方案的想法))
问题
你是贝尔兰繁荣首都的快乐市长,但运气不好 - 一个可怕的怪物定居在郊区,并正在攻击在首都和邻近城市之间行驶的贸易商队。为了摆脱怪物,你决定从城市的冒险家公会雇佣一支英雄团队。公会提供 n 个战士,第 i 个战士拥有高生命值单位和低攻击单位。需要杀死的怪物有一定的生命值。
只要怪物还剩下正数的生命值,并且至少一名英雄还剩下正数的生命值,就会发生以下情况:
首先,每个活着的英雄都会对怪物造成相当于其攻击值的伤害。如果怪物的生命值降到零,则战斗结束;然后,如果怪物还活着,它会对每个英雄造成 1 点伤害。每个生命值降至零的英雄都会死亡。由于金库有限,你需要雇佣最少数量的英雄来杀死怪物。但你也不希望队伍中至少有一名英雄死亡,所以你需要招募最少数量的英雄,这样他们才能不损失地击杀怪物。
笔记
在第一组输入数据中,三个英雄就足以无损失地击杀怪物。例如,这些英雄可能是数字2、3、4。他们的总攻击力是6,并且两次攻击就能杀死怪物。
在第一次测试的第二组输入数据中,有一个英雄,他的实力足以立即杀死怪物。
输入格式
输入数据的第一行包含一个整数 t (1 ≤ t ≤ 1000) — 输入数据集的数量。以下是各组的说明。每组的第一行包含整数 a (1 ≤ a ≤ 109) — 怪物的生命值。每组的第二行包含一个整数 n (1 ≤ n ≤ 2⋅105) — 公会提供雇佣的战士总数。每组的第三行包含 n 个整数 h1,h2,…,hn (1 ≤ hi ≤ 109) — 每个英雄的生命值单位。每组第四行包含n个整数d1,d2,…,dn (1 ≤ di ≤ 109)——每个英雄的攻击单位。保证所有输入数据集的n之和不超过2⋅105
输出格式
对于每组输入,在单独的行上打印一个整数:必须雇佣才能无损失地杀死怪物的英雄的最小数量,如果这是不可能的,则为 -1。
例子
Входные данные:
2
12
5
1 2 3 3 4
2 4 1 1 1
10
1
1
14
Выходные данные:
3
1
哦对了,时间限制是2秒。由于您需要显示所需的战士数量,而不是他们的索引,因此您可能不需要查看所有选项或类似的内容
以@StanislavVolodarskiy的想法为基础,我用python写了这个:
answer = list()
for _ in range(int(input())):
a = int(input())
n = int(input())
hp_war = list(map(int, input().split()))
d_war = list(map(int, input().split()))
attack = dict()
for i in range(n):
attack[d_war[i]] = attack.get(d_war[i], list()) + [hp_war[i]]
attack = {key: sorted(attack[key], reverse=True) for key in sorted(attack, reverse=True)}
max_h_lvl, k = max(hp_war) + 1, n + 1
h_left, h_level, h_right = 1, max_h_lvl // 2, max_h_lvl
while True:
sum_attack, flag, cnt = 0, 0, 0
for a_w in attack:
for h_w in attack[a_w]:
if h_w >= h_level:
cnt += 1
sum_attack += a_w
if sum_attack * h_level >= a:
flag = 1
break
continue
break
if flag == 1:
break
if flag:
k = min(k, cnt)
if h_right - h_left <= 1:
break
if flag:
h_right, h_level = h_level, (h_level + h_left) // 2
else:
h_left, h_level = h_level, (h_level + h_right) // 2
if k == n + 1:
answer.append(-1)
else:
answer.append(k)
for ans in answer:
print(ans)
在我看来,这是一个有效的解决方案,但在测试系统看来却不是。尽管如此,我还是错过了一些东西。但什么?