CF1119G Get Ready for the Battle
题目描述
最近,Evlampy 安装了一款有趣的电脑游戏,其中一个玩法是将军队分成若干小组,然后与敌人的小组作战。我们来考虑这个战斗的简化版本。
在即将到来的战斗中,Evlampy 需要对抗由 $m$ 个小组组成的敌军,第 $i$ 个小组拥有 $hp_i$ 点生命值。
Evlampy 的军队由 $n$ 名相同的士兵组成。在每场战斗前,他需要将自己的军队恰好分成 $m$ 个小组(可以有空组),使得所有小组的总人数为 $n$。战斗按回合进行。在每一回合中,Evlampy 的每个小组会攻击恰好一个敌方小组。因此,每一回合可以用一个长度为 $m$ 的数组 $a_1, a_2, \ldots, a_m$ 来描述,表示第 $i$ 个 Evlampy 的小组攻击第 $a_i$ 个敌方小组。不同的小组可以攻击同一个敌方小组,每一回合可以独立选择数组 $a$。
每一回合后,每个敌方小组的生命值会减少本回合中所有攻击该小组的 Evlampy 小组的士兵总数。当某个敌方小组的生命值降至 $0$ 或更低时,该小组被摧毁。Evlampy 的士兵不会损失生命值。
Evlampy 意识到即将到来的战斗将持续整晚,这让他很沮丧,因为这样他就没有时间完成作业了。现在,Evlampy 希望你编写一个程序,帮助他用最少的回合赢得战斗。你能帮帮他吗?
换句话说,请你找出摧毁所有敌方小组所需的最少回合数,并给出一种可行的方案。你需要给出军队分组的方法,以及每一回合的攻击数组 $a$。
输入格式
第一行包含两个整数 $n$ 和 $m$($1 \leq m \leq n \leq 10^{6}$),分别表示 Evlampy 军队中的士兵数和敌军中的小组数。$m$ 也是 Evlampy 可以分组的最大组数。
第二行包含 $m$ 个整数 $hp_1, hp_2, \ldots, hp_m$($1 \leq hp_i \leq 10^{6}$),表示每个敌方小组的生命值。
保证所有 $hp_i$ 的和不超过 $10^{6}$。
输出格式
输出一个整数 $t$,表示赢得战斗所需的最少回合数。
接下来一行输出 $m$ 个整数 $s_1, s_2, \ldots, s_m$($s_i \ge 0$,$s_1 + s_2 + \ldots + s_m = n$),表示 Evlampy 的第 $i$ 个小组应包含的士兵数。
接下来的 $t$ 行,每行输出 $m$ 个整数 $a_1, a_2, \ldots, a_m$($1 \le a_i \le m$),描述每一回合的攻击方案。每个整数表示本回合中第 $i$ 个 Evlampy 的小组攻击第 $a_i$ 个敌方小组。允许攻击已经被摧毁的敌方小组。
说明/提示
第一个样例如下图所示。

由 ChatGPT 4.1 翻译