#P1015. Jury Compromise

Jury Compromise

以下题面由 AI 翻译。

问题描述

在遥远的弗罗布尼亚国,法院判决的裁决是由陪审团决定的。每一次法院案件开庭时,都会选出一个陪审团。具体来说,首先从公众中随机抽取一些人,组成一个备选人员池。对于池中的每个人,辩护方和起诉方都会给出一个0到20的评分,表示对这个人的偏好程度。0表示完全不喜欢,20则表示这个人非常适合担任陪审员。

根据这些评分,法官会选出陪审团。为了确保案件公正,陪审团在辩护和起诉方面应该趋于平衡。因此,陪审团的选择必须满足双方的要求。

现在我们将这个问题更加精确地描述出来:给定一个备选人员池n个人,每个人都有一个属于辩护方的评分d_i和一个属于起诉方的评分p_i,你需要从中选出m个人组成的陪审团。如果J是{1,..., n}的一个子集,且包含m个人,则D(J ) = sum(dk) k属于J 是这个陪审团在辩护方面的总评分,P(J) = sum(pk) k属于J 是这个陪审团在起诉方面的总评分。

对于一个最优的陪审团J ,|D(J) - P(J)|必须最小。如果有多个陪审团满足|D(J) - P(J)|最小,则选择使得D(J) + P(J)最大的那个陪审团,因为这样可以确保陪审团在辩护和起诉方面都趋于理想。

你需要编写一个程序来实现这个陪审团选择过程,并且为给定的一组候选人选出最优的陪审团。</h2>

输入

输入文件包含多个陪审团选择轮次。每个轮次的第一行包含两个整数n和m,其中n是备选人员的数量,m是陪审团成员数量。

这些值满足1 < n ≤ 200,1 < m ≤ 20,并且m ≤ n。接下来的n行每行包含两个整数pi和di,表示第i个人的起诉方评分和辩护方评分(i = 1,...,n)。每轮选择之间用一个空行隔开。

输入文件以n = m = 0的那一轮结束。</h2>

输出

对于每个轮次,输出一行包含当前轮次的编号('Jury #1','Jury #2'等)。接下来的一行输出这个陪审团的D(J)和P(J),如下所示:

最佳陪审团的D值为4,P值为6。

再下一行输出被选中的m个人的编号。每个编号之间用一个空格隔开。在每名候选人的编号前面输出一个空格。

每轮结束后输出一个空行。

```plaintext 4 2 1 2 2 3 4 1 6 2 0 0 ```

提示

如果你的算法效率不高,可能无法在规定时间内完成任务。</h2>

来源

南西欧区域竞赛 1996