poj1015 Jury Compromise 题解报告

2023-11-20 21:51

本文主要是介绍poj1015 Jury Compromise 题解报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目传送门

【题目大意】

要从n个候选人中选出m人作为陪审团,对于这n个候选人,每个人都有两个分数,一个是辩护方的分数,一个是起诉方的分数。要求一种方案,使得辩护方分数之和与起诉方分数之和的差最小而和最大。求这种方案下辩护方分数和起诉方分数。

【思路分析】

我们可以把这道题目看做是具有多个“体积维度”的0/1背包问题。把n个候选人看做n个物品,那么每个物品有以下三种“体积”:

1.“人数”,每个候选人的“人数”体积都是1,最终要填满容积为m的背包

2.“辩方得分”,即辩方给候选人打的分数,记为a[i]

3.“控方得分”,即控方给候选人打的分数,记为b[i]

so我们依次考虑每个候选人是否进入陪审团,当考虑到第i个人时,f[j][d][p]表示已经有j个人被选入陪审团,当前辩方总分为d,控方总分为p的状态是否可行。$$f[j][d][p]=f[j][d][p]orf[j-1][d-a[i]][p-b[i]]$$初始值:f[0][0][0]=true,其余均为false。

目标:找到一个状态f[m][d][p],满足f[m][d][p]=true,并且|d-p|最小,同时d+p最大。

接下来我们考虑一下如何优化,我们可以把|d-p|作为一个维度,并且用f[j][k]表示前i个人中选出j个,保证|d-p|等于k时d+p的最大值。

于是得到新的转移方程:$$f[j][k]=max(f[j][k],f[j-1][k-(a[i]-b[i])]+a[i]+b[i])$$初始值:f[0][0]=0,其余均为负无穷

目标:找到一个状态f[j][k]满足|k|尽量小,当|k|相同时f[j][k]尽量大。

在转移中要对j倒序循环,这样才符合0/1背包的特殊做法。

【代码实现】

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define rg register
 6 #define go(i,a,b) for(rg int i=a;i<=b;i++)
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 using namespace std;
 9 int n,m,dp[25][802];
10 int p[202],d[202],S[202],V[202];
11 int tag[25][802];
12 //tag[i][j]表示选了i个人分数为j时第i个人的编号
13 bool check(int a,int b,int c){//判断c是否被选过
14     while(a>0&&c!=tag[a][b]){
15         b-=V[tag[a][b]];a--;
16     }
17     return a;
18 }
19 int main(){
20     int num=0;
21     while(scanf("%d%d",&n,&m)){
22         if(n==0&&m==0) break;
23         go(i,1,n){
24             scanf("%d%d",&p[i],&d[i]);
25             S[i]=p[i]+d[i];
26             V[i]=p[i]-d[i];
27         }
28         memset(dp,-1,sizeof(dp));
29 //dp[i][j]表示选了i个人使分数差值为j的最大和,如不存在则为-1
30         memset(tag,0,sizeof(tag));
31         int start=20*m;
32         dp[0][start]=0;//相当于dp[0][0]
33         go(i,1,m) go(j,0,2*start)
34             if(dp[i-1][j]!=-1)
35                 go(k,1,n)
36                     if(!check(i-1,j,k)&&dp[i][j+V[k]]<dp[i-1][j]+S[k]){
37                         dp[i][j+V[k]]=dp[i-1][j]+S[k];
38                         tag[i][j+V[k]]=k;
39                     }
40         int j;
41         for(j=0;j<=start;j++)
42             if(dp[m][start-j]!=-1||dp[m][start+j]!=-1) break;
43         int sum=dp[m][start-j]>dp[m][start+j]?start-j:start+j;
44         int P=(dp[m][sum]+sum-start)/2,D=(dp[m][sum]-sum+start)/2;
45         printf("Jury #%d\n",++num);
46         printf("Best jury has value %d for prosecution and value %d for defence:\n",P,D);
47         int res[25];
48         for(rg int i=0,j=m,k=sum;i<m;i++){
49             res[i]=tag[j][k];
50             k-=V[tag[j][k]];
51             j--;
52         }
53         sort(res,res+m);
54         go(i,0,m-1) printf(" %d",res[i]);
55         puts("");puts("");
56     }
57     return 0;
58 }
代码戳这里

 

转载于:https://www.cnblogs.com/THWZF/p/10940433.html

这篇关于poj1015 Jury Compromise 题解报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397677

相关文章

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析