在一个遥远的国家,一名嫌疑犯是否有罪需要由陪审团来决定。
陪审团是由法官从公民中挑选的。

法官先随机挑选 NNN 个人(编号 1,2…,N1,2…,N1,2…,N)作为陪审团的候选人,然后再从这 NNN 个人中按照下列方法选出 MMM 人组成陪审团。

首先,参与诉讼的控方和辩方会给所有候选人打分,分值在 000 到 202020 之间。
第 iii 个人的得分分别记为 p[i]p[i]p[i] 和 d[i]d[i]d[i]。 为了公平起见,法官选出的 MMM 个人必须满足:辩方总分 DDD 和控方总分 PPP 的差的绝对值 ∣D−P∣|D−P|∣D−P∣ 最小。
如果选择方法不唯一,那么再从中选择辨控双方总分之和 D+PD+PD+P 最大的方案。求最终的陪审团获得的辩方总分 DDD、控方总分 PPP,以及陪审团人选的编号。

注意:若陪审团的人选方案不唯一,则任意输出一组合法方案即可。

输入格式:

输入包含多组测试数据。
每组测试数据第一行包含两个整数 NNN 和 MMM。
接下来 NNN 行,每行包含两个整数 p[i]p[i]p[i] 和 d[i]d[i]d[i]。
每组测试数据之间隔一个空行。
当输入数据 N=0,M=0N=0,M=0N=0,M=0 时,表示结束输入,该数据无需处理。

输出格式:
对于每组数据,第一行输出 KaTeX parse error: Expected 'EOF', got '#' at position 6: Jury #̲C,CCC
为数据编号,从 111 开始。
第二行输出 BestjuryhasvaluePforprosecutionandvalueDfordefence:Best jury has value P for prosecution and value D for defence:BestjuryhasvaluePforprosecutionandvalueDfordefence:,PPP为控方总分,DDD 为辩方总分。
第三行输出按升序排列的陪审人选编号,每个编号前输出一个空格。
每组数据输出完后,输出一个空行。

数据范围:
1≤N≤2001≤N≤2001≤N≤200
1≤M≤201≤M≤201≤M≤20
0≤p[i],d[i]≤200≤p[i],d[i]≤200≤p[i],d[i]≤20

输入样例:
4 2
1 2
2 3
4 1
6 2
0 0

输出样例:

Jury #1
Best jury has value 6 for prosecution and value 4 for defence:
2 3

首先 遇到背包问题, 确定背包类型, 每个人只能选一个, 故为 010101 背包, 然后题目要求具体方案, 首先答案要求满足两个条件, 第一是要 ∣D−P∣|D - P|∣D−P∣ 最小,其次是 D+PD + PD+P 最大, 我们可以将 D+PD + PD+P 定义为背包的属性

状态定义: f[i][j][k]f[i][j][k]f[i][j][k]: 在前 iii 个人中选, 总人数不超过 jjj, 并且总差值为 kkk 的集合
状态属性: D+PD + PD+P 的最大值
状态计算: 选第 iii 个人 不选第 iii 个人
f[i][j][k]=max(f[i−1][j][k],f[i−1][j−1][k−(p[i]−d[i])]+p[i]+d[i]);f[i][j][k] = max(f[i - 1][j][k], f[i - 1][j - 1][k - (p[i] - d[i])] + p[i] + d[i]);f[i][j][k]=max(f[i−1][j][k],f[i−1][j−1][k−(p[i]−d[i])]+p[i]+d[i]);

求出 D+PD + PD+P 的最大值并不难, 难点在于如何得到具体方案,我们可以通过方向搜一遍, 如果从终点状态,一直迭代到起始状态,能够进行状态转移,我们就记下这个方案

注意: 由于p[i] 是从 111 ~ 202020, 所以 p[i]−d[i]p[i] - d[i]p[i]−d[i] 是从 −40-40−40 ~ 404040, 所以总的 p[i]−d[i]p[i] - d[i]p[i]−d[i] 是从 −400-400−400 ~ 400400400, 但是如果直接使用,会导致数组越界,所以我们加上一个偏移量取名为 basebasebase,其值 400400400, 故差值的范围就会变成 000 ~ 800800800

#include<bits/stdc++.h>using namespace std;const int N = 210, M = 810, base = 400;int f[N][21][M], p[N], d[N], ans[N], n, m;int main()
{int T = 1;while(cin >> n >> m, n, m){for(int i = 1; i <= n; i ++ ) cin >> p[i] >> d[i];  //读入memset(f, -0x3f, sizeof f);   //因为求最大值, 故赋值为负无穷f[0][0][base] = 0;  //初始化为0int cnt = 0;   //初始化for(int i = 1; i <= n; i ++)  //枚举前i个人for(int j = 0; j <= m; j ++) //枚举已经选了的人for(int k = 0; k < M; k ++ ) //枚举差值 0~801{f[i][j][k] = f[i - 1][j][k];  //不选第 i 个人int t = k - (p[i] - d[i]);   //计算出差值,看是否符合题意if(t < 0 || t > M ) continue;   if(j < 1) continue;  //是否可以转移f[i][j][k] = max(f[i][j][k], f[i - 1][j - 1][t] + p[i] + d[i]);   //状态转移}int v = 0;while( f[n][m][base + v] < 0 && f[n][m][base - v] < 0) v ++;// 当v小于0和v大于0 都不合题意是, v++;if(f[n][m][base + v] > f[n][m][base - v]) v = base + v;else v = base - v;//当v,-v都存在时,取最大值int j = m, i = n, k = v;while(j){if(f[i][j][k] == f[i - 1][j][k]) i --;//如果可以不选第i个人else {ans[cnt ++ ] = i;  //选了第i个人k -= p[i] - d[i];  //差值减小i --, j --; //减小}}int a = 0, b = 0;for(int i = 0; i < cnt; i ++ ) a += p[ans[i]], b += d[ans[i]];//记录答案printf("Jury #%d\n", T++);printf("Best jury has value %d for prosecution and value %d for defence:\n", a, b);sort(ans, ans + cnt);  //排序,保证编号是从小到大的//打印方案for(int i = 0; i < cnt; i ++ ) cout << ans[i] << ' ';cout << '\n';cout << '\n';}
}

<<算法竞赛进阶指南>>:陪审团相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  2. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  3. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  4. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  5. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  6. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  7. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  8. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

  10. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

最新文章

  1. Spring-AOP @AspectJ进阶之增强织入的顺序
  2. apache AH01630: client denied by server configuration错误解决方法
  3. 解决Linux因非正常关机或死机重启后进入 initramfs 问题
  4. 好的重构方法才能摆脱“屎山”
  5. bzoj 3196/tyvj p1730 二逼平衡树
  6. pat Simulation Test for PAT(B) 9月4日
  7. 编程语言中,差、交、并、自然连接、选择、投影、笛卡尔积分别都是什么运算...
  8. oracle rollup 排序,Oracle教程之rollup用法
  9. mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
  10. adb 增加认证功能
  11. 计算机基础的算法思想
  12. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_15-webpack研究-webpack-dev-server-程序调试...
  13. 【UE4 Plugin】5个必备的蓝图插件,极大提高开发效率
  14. LDR6023E-解决苹果PD 20W快充市场供不应求
  15. 类成员函数作为线程函数使用
  16. mne plot出错_MNE-Python 环境配置 | win 10
  17. Frida学习之旅(一)--Google Pixel手机的ROOT
  18. 2022年,一个技术账号的年终独白,满篇都写着2个字:真难。
  19. XSL中特殊符号详解
  20. C语言基本数据之实型

热门文章

  1. 科技「垦荒」,AI护虎
  2. 深入了解 Squid 代理服务器及应用
  3. su联合推拉使用方法_12个最实用的SU建模技巧
  4. C#中接口IFormattable/IFormatProvider/ICustomFormatter的区别与用法
  5. 伪装图片 攻击php,攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)...
  6. python神经网络编程 代码,python神经网络算法代码
  7. 洪水填充算法_计算机图形:洪水填充算法
  8. 第一章 基本架设服务器流程
  9. 快速搞懂Oracle 19c安全新特性 (二) Privilege Analysis(权限分析)
  10. 玩平衡车系列——编码器使用教程与测速原理