POJ 1015--Jury Compromise

题解:POJ1015 Jury Compromise 【DP】 传送门 描述 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团。选m人的办法是: 控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0到20。为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分和控方总分的差的绝对值最小。如果有多种选择方案的辩方总分和控方总分的之差... 阅读详情

题意

题目大意是讲,在遥远的国家佛罗布尼亚,嫌犯由陪审团决定是否有罪。先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团。控方和辩方会给所有候选人打分,分值从0到20(分数越高代表越喜欢)。为了公平起见,选出的m个人必须满足辩方总分和控方总分之差的绝对值最小。如果出现多种方案,那么选辩控双方总分之和最大的方案即可。

分析

比较容易想到的就是动态规划,先对候选人进行排序,由于评分差为-20到20,将评分差加上20,变为0到40。用一个二维数组表示选中的第几号人v[index][value], 假定评分数组为diff[] = {10, 20, 23, 29…},比如v[1][20]==2,代表选第一个人时,评分为20时,选中了第2号人。以此类推v[2][43]==3,这样可以得到一个完整的选择链(想要知道前一个人的选择,只需求v[2 - 1][43 - diff[3]] = v[1][20] = 2)。

最后,假定需要选择10个人,若v[10][400] != 0,那么v[10][400]下面的选择链便是最优解。反之搜索最靠近v[10][400]的情况即可。比如当v[10][390] != 0 && v[10][405] != 0,那么v[10][405]必定优于v[10][390]。事实上,这种方法会有重复计算的情况,再加优化的话,100MS内应该没什么问题。

代码如下:
Memory: 328K Time: 250MS Length:154LINES

#include<iostream>
#include<cstring>
using namespace std;
struct JURY                           //陪审员
{
    int count;                    //原始编号
    int pi;
    int di;
};
int v[21][801] = {};
JURY pJury[200];
inline int inline_sum(JURY& j) { return j.di + j.pi; }
inline int inline_diff(JURY& j) { return j.pi - j.di + 20; }
void Sort_Insert(const int c)          //插入排序
{
    for (int i = 1; i < c; ++i)
    {
        JURY temp = pJury[i];
        int j = i;
        while (j > 0)
            if (inline_diff(temp) < inline_diff(pJury[j - 1]))
            {
                pJury[j] = pJury[j - 1];
                --j;
            }
            else    break;
            pJury[j] = temp;
    }
}
void Find_min_max(const int c, int count, int& minval, int& maxval)  //计算前后count个候选人辨控差的和
{
    for (int i = 0; i < count; ++i)
    {
        minval += inline_diff(pJury[i]);
        maxval += inline_diff(pJury[c - 1 - i]);
    }
}
int Update(int depth, int value, int tmpvalue)                    //更新选择链
{
    int cu = 0;
    int pen = 0;
    while (depth > 0)
    {
        cu += inline_sum(pJury[v[depth][value]]);
        pen += inline_sum(pJury[v[depth][tmpvalue]]);
        value -= inline_diff(pJury[v[depth][value]]);
        tmpvalue -= inline_diff(pJury[v[depth][tmpvalue]]);
        --depth;
    }
    return pen - cu;
}
bool find_pos(int depth, int value, int k)                    //在一个选择链上查找某个候选人是否已经存在
{
    while (depth > 0)
    {
        if (v[depth][value] == k)
            return true;
        value -= inline_diff(pJury[v[depth][value]]);
        --depth;
    }
    return false;
}
inline int inline_max(int a, int b) { return inline_sum(pJury[a]) > inline_sum(pJury[b]) ? a : b; }
int main()
{
    int candidates = 0;
    int members = 0;
    int count = 0;
    while (cin >> candidates >> members && candidates != 0 && members != 0)
    {
        int selected[200] = {};
        memset(&v, -1, sizeof(v));
        for (int i = 0; i < candidates; ++i)
        {
            cin >> pJury[i].pi >> pJury[i].di;
            pJury[i].count = i;
        }
        Sort_Insert(candidates);
        for (int j = 1; j <= members; ++j)
        {
            int maxval = 0;
            int minval = 0;
            Find_min_max(candidates, j, minval, maxval);
            for (int i = minval; i <= maxval; ++i)
            {
                for (int k = 0; k < candidates - members + j; ++k)
                {
                    if (i < inline_diff(pJury[k]));
                    else if (i == inline_diff(pJury[k]) && j == 1)          v[j][i] = v[j][i] != -1 ? inline_max(v[j][i], k) : k;
                    else if (v[j - 1][i - inline_diff(pJury[k])] != -1)
                    {
                        if (v[j][i] == -1) //无值时,先搜索是否已存在
                        {
                            if (!find_pos(j - 1, i - inline_diff(pJury[k]), k))     v[j][i] = k;
                        }
                        else     //有值时,先搜索,再比较
                        {
                            if (!find_pos(j - 1, i - inline_diff(pJury[k]), k))
                                if (inline_sum(pJury[k]) - inline_sum(pJury[v[j][i]]) + Update(j - 1, i - inline_diff(pJury[v[j][i]]), i - inline_diff(pJury[k])) > 0)
                                    v[j][i] = k;
                        }
                    }
                }
            }
        }
        int v1, v2, val;
        val = v1 = v2 = members * 20;
        if (v[members][v1] == -1)              //寻找最优解
        {
            while (v1 <= members * 40)
            {
                ++v1;
                --v2;
                if (v[members][v1] == -1 && v[members][v2] != -1)
                {
                    val = v2;
                    break;
                }
                else if (v[members][v1] != -1 && v[members][v2] == -1)
                {
                    val = v1;
                    break;
                }
                else if (v[members][v1] != -1 && v[members][v2] != -1)
                {
                    if (inline_sum(pJury[v[members][v1]]) - inline_sum(pJury[v[members][v2]]) + Update(members - 1, v2 - inline_diff(pJury[v[members][v2]]), v1 - inline_diff(pJury[v[members][v1]])) > 0)
                        val = v1;
                    else            val = v2;
                    break;
                }
            }
        }
        int sum_pi = 0;
        int sum_di = 0;
        for (int i = members; i > 0; --i)
        {
            selected[pJury[v[i][val]].count] = 1;
            sum_pi += pJury[v[i][val]].pi;
            sum_di += pJury[v[i][val]].di;
            val -= inline_diff(pJury[v[i][val]]);
        }
        cout << "Jury #" << ++count << endl;
        cout << "Best jury has value " << sum_pi << " for prosecution and value " << sum_di << " for defence:" << endl;
        int mm = 0;
        for (int i = 0; i < candidates && mm < members; ++i)
            if (selected[i])
            {
                cout << " " << i + 1;
                ++mm;
            }
        cout << endl << endl;
    }
    return 0;
}
攻克Windows平台3DGS复现:从环境配置到可视化实战全记录 本文详细记录了在Windows平台成功复现3D Gaussian Splatting(3DGS)的完整流程,涵盖从环境配置、依赖安装、数据准备到模型训练与可视化的全步骤。重点解决了Windows下CUDA版本匹配、Visual Studio编译及SIBR_viewers可视化工具部署等核心难题,为开发者提供了一份详实的避坑指南与实战手册。 阅读详情

相关推荐

Windows 11 系统部署 OpenClaw 完整指南:从零到一的 AI 助手搭建

OpenClaw(昵称“小龙虾”)是一款开源 AI 代理工具,定位为“AI 指挥官”,能够接收指令、调用工具并自动化处理任务。它支持对接国内外多款大模型,所有数据本地存储,兼顾实用性与安全性。本文将详细介绍在 Windows 11 系统上部署 OpenClaw 的完整流程。OpenClaw 在 Windows 11 上的部署虽然有一定技术门槛,但按照本文的步骤操作,大多数用户都能顺利完成安装。环境准备是基础:确保 Node.js ≥22 版本,使用管理员权限操作安装方式灵活选择。

weixin_41484939的博客 800

[POJ][1015]Jury Compromise 正确做法

dp[i][j]=k 表示选取 i 个人,其评价差之和为 j 的所有方案中总评价之和最大为 k 三重循环,找出各种人数在各个评价差上的最大总评价之和,评价差最多就m202,因为是-20m到20m之间,所以区间平移,计算出来最大区间也不过800。 错误做法中,path存储路径有缺陷,当要选择6个人时,碰到选择5个人的方案有两种评价差的和一样小,总评价的和一样大,这是path只会记录一种方案,而如果答...

仰望蓝天的博客 411

国产AI芯片实战:用寒武纪MLU370低成本部署DeepSeek-R1,实测推理效果与成本分析

本文详细介绍了寒武纪MLU370芯片在部署DeepSeek-R1大模型时的实战效果与成本优势。通过实测数据对比,MLU370在推理速度、能效比和本地化服务方面表现突出,尤其适合智能客服、内容生成等场景,可显著降低硬件投入和运维成本。

weixin_30613727的博客 455

POJ1015-Jury Compromise

全解题报告索引目录 -> 【北大ACM – POJ试题分类】 转载请注明出处:http://exp-blog.com ------------------------------------------------------------------------- 大致题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n...

ζёСяêτ - 小優YoU 1万+

Jetson Orin 上拉取 GMSL 相机流并保存在 DMA 内存中

本文介绍了在NVIDIA Jetson Orin平台上实现GMSL相机DMA内存共享的低延迟采集方案。通过V4L2+NvBufSurface技术,将相机数据直接存入DMA缓冲区,避免传统流程中的CPU拷贝开销。文章详细说明了设备初始化、DMA缓冲区分配、V4L2绑定等关键步骤,并展示了调用示例。该方案支持零拷贝访问,适用于AI推理、硬件编码等场景,能显著提升车载视觉系统的实时性能,为多路GMSL相机接入和低延迟处理提供了高效解决方案。

J。 695

基于MATLAB的脑功能网络工具箱:BCT与FCLab

脑功能网络分析是神经科学领域的一个重要研究方向,它通过分析大脑中神经元之间的连接模式和信息传递方式,揭示脑网络的结构和功能。在这个领域,MATLAB是一个广泛使用的工具,提供了丰富的函数和工具箱来进行脑功能网络的分析和可视化。这些工具箱提供了丰富的函数和工具,使得脑功能网络的计算和分析变得更加简单和高效。在上述示例代码中,我们首先导入BCT工具箱,并构建一个邻接矩阵来表示脑网络的连接关系。在上述示例代码中,我们首先导入FCLab工具箱,并导入脑功能数据。函数对数据进行预处理,如去除噪声、降采样等操作。

web_bug407的博客 2608

POJ_1015_Jury Compromise

dp

edward_108 273

编译zlib库给IOS平台用

在弹出的下面对话框中选择Unix Makefiles ,然后点击(Done)完成。使用 lipo与otool查看库类型为arm64,现在可在ios平台使用该库了。zlib自带CMakeLists.txt 所以用CMake-GUI来生成。修改为与系统当前安装的cmake版本 (如:3.22.1)选择zlib源码目录及输出目录,输入下图的CMAKE参数。点击Configure,在弹出的对话框中选择Yes。cmake --install . 进行安装。cmake --build . 进行编译。

994

[POJ][1015]Jury Compromise

Description In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the general public. Every time a trial is set to begin, a jury has to be s

软件工程学森 1556

【Windows Server 2019】组策略的配置与管理——理论基础

博文介绍了组策略的定义,作用和分类。组策略包括计算机配置和用户配置;组策略又分为为基于本地的组策略和基于AD(活动目录)的域组策略。并说明了不同组策略发生冲突时默认的规则。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 1万+

1、掌握 Microsoft Dynamics 365 Business Central 开发全解析

本文全面解析了Microsoft Dynamics 365 Business Central的开发全流程,涵盖开发环境搭建、AL语言扩展开发、定制解决方案实现、高级开发技术、文件与报表处理、打印功能、调试与性能优化、API使用、Azure和Power Platform集成、DevOps实践以及生成式AI应用。同时探讨了开发工具技巧、常见问题解决、开发流程优化、团队协作要点及未来技术趋势,帮助开发者系统掌握Business Central开发核心技能,提升企业级应用开发效率与质量。

food6的博客 110

poj 1015 Jury Compromise(动态规划,并找出路径)*

题目链接:http://poj.org/problem?id=1015 题面: Jury Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35458 Accepted: 9586 Special Judge Description In Frobnia, a far-away country, the...

nowting的博客 312

【花雕学编程】嵌入式破局:MimiClaw入局后,“小龙虾”AI智能体生态的竞争与未来

摘要: 2026年初,开源项目OpenClaw的爆发式增长带动AI智能体赛道迅速崛起,国内外厂商竞相布局,形成多元化的“小龙虾”生态。国外开源社区推出的嵌入式智能体MimiClaw填补了边缘设备场景空白,重塑行业竞争格局。本文系统梳理生态构成,分析云厂商(如腾讯、阿里云)、大模型厂商(如智谱、MiniMax)、硬件/OS厂商(华为)及开源独立派(有道龙虾、MimiClaw)的差异化策略,并预判未来趋势:消费级渗透加速、云边协同、IM整合及模型与Agent深度绑定。同时提醒生态存在数据泄露等高危风险,需警惕安

雕爷学编程 884

POJ - 1015 Jury Compromise

POJ - 1015 Jury Compromise #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int N = 210, M = 810, base = 400; int n, m; int p[N], d[N]; int f[N][21][M]; int ans[N]; int main() { int T = 1;

00后的博客 337

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

poj 1015 Jury Compromise

http://poj.org/problem?id=1015 Jury Compromise Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27117   Accepted: 7140   Special Judge Description In

大太阳 536

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

POJ 1015 Jury Compromise

/**//**************************************Problem:POJ1015JuryCompromiseTime:32MSMemory:440KAcceptedTime:2009-04-1214:21:50Tips:《程序设计导引及在线实践》10.6,有点难以理解**************************************...

weixin_30333885的博客 86

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Jury Compromise 【POJ 1015】

题目链接 POJ 1015 大概题意 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团。选m 人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20。为了公平起见,法官选出陪审团的原则是:选出的m 个人,必须满足辩方总分D和控方总分P的差的绝对值|D-P|最小...

qq_41925919的博客 224

Jury Compromise POJ - 1015

一、内容 在一个遥远的国家,一名嫌疑犯是否有罪需要由陪审团来决定。 陪审团是由法官从公民中挑选的。 法官先随机挑选N个人(编号1,2…,N)作为陪审团的候选人,然后再从这N个人中按照下列方法选出M人组成陪审团。 首先,参与诉讼的控方和辩方会给所有候选人打分,分值在0到20之间。 第 i 个人的得分分别记为p[i]和d[i]。 为了公平起见,法官选出的M个人必须满足:辩方总分D和控方总分P...

Tizzi的博客 1395

POJ1015 Jury Compromise

POJ1015 Jury Compromise 我们可以将每个候选人的辩控差作为该物品的体积之一,把辩控和作为物品的价值。 因为评价差的总分值最大可能就只有[-400,400],所以我们整体加上20*m 为叙述问题方便,现将任一选择方案中,辩方总分和控方总分之差简称为“辩控差”,辩方总分和控方总分之和称为“辩控和”。第i 个候选人的辩方总分和控方总分之差记为V(i),...

weixin_33958366的博客 82

【poj1015】Jury Compromise

Description In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the general public. Every time a trial is set to begin, a jury has to be s

zyf2000 1315

POJ 1015 Jury Compromise

Jury Compromise http://poj.org/problem?id=1015 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22094   Accepted: 5670   Special Judge Description In Frobnia...

weixin_33850890的博客 122

北大ACM(POJ1015-Jury Compromise)

Question:http://poj.org/problem?id=1015 问题点:DP。 1 Memory: 1352K Time: 94MS 2 Language: C++ Result: Accepted 3 4 #include <iostream> 5 #include <vector> 6...

aenv6574的博客 200

【poj1015】 Jury Compromise

http://poj.org/problem?id=1015 (题目链接)题意:随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m 人组成陪审团。选m人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20。为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分D和控方总分P的差的绝对值|D-P|最小。如果有多种选择方案的 |D-P| 值相同,那么选辩控

MashiroSky的博客 701
上一篇: POJ 1032--Parliament
下一篇: POJ 1014--Dividing
Hering_Linux
博客等级 码龄12年 0粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值