news 2026/3/10 22:14:42

UVa 10654 The Uxuhul Voting System

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 10654 The Uxuhul Voting System

题目分析

本题描述了一个古代文明的投票系统,我们需要根据每位祭司的偏好顺序,推算出最终三个议题的投票结果。这个问题的核心在于每位祭司都会基于后续祭司的最优选择来做出自己的最优决策,因此我们需要逆向推理整个投票过程。

问题重述

  • 有三个议题,每个议题用一块双面石头表示(黑面N/ 白面Y)。
  • 初始状态为NNN(全否)。
  • m mm位祭司按年龄从小到大依次投票。
  • 每位祭司必须翻转恰好一块石头,改变一个议题的当前结果。
  • 投票结束后,石头的最终朝上面决定三个议题的最终结果。
  • 每位祭司在投票前会公开自己对8 88种可能结果的偏好顺序(1表示最喜欢,8表示最不喜欢)。
  • 每位祭司都是完美理性的,会根据已知的其他祭司偏好,选择能使最终结果对自己最有利的翻转方式。
  • 给定n nn个测试用例,每个用例给出m mm和每位祭司的偏好顺序,要求输出最终的投票结果。

关键点

  1. 状态表示:三个议题共有2 3 = 8 2^3 = 823=8种状态,可以用0 007 77的整数表示,其中二进制位0 00表示第一个议题(最低位对应第一块石头),1表示N0表示Y(或者反过来,只要一致即可)。在代码中我们使用outcomes数组进行映射。
  2. 决策顺序:祭司按年龄从小到大投票,但决策逻辑是逆向的。因为最后一位祭司投票后状态即为最终结果,而前面的祭司会预判后续祭司的选择。
  3. 最优子结构:对于当前祭司,他可以根据下一个祭司在不同状态下的最终结果,选择对自己最有利的翻转方式。这符合动态规划的特性。

解题思路

逆向动态规划

d p [ i ] [ s t a t e ] dp[i][state]dp[i][state]表示从第i ii位祭司(0-based)开始投票,当前状态为s t a t e statestate0 − 7 0 - 707)时,最终会达到的结果(用0 − 7 0 - 707表示,对应8 88种结果)。

  • 边界条件:当所有祭司都投票完毕(即i = m i = mi=m),最终状态就是当前状态,所以d p [ m ] [ s t a t e ] = s t a t e dp[m][state] = statedp[m][state]=state
  • 状态转移:对于第i ii位祭司,当前状态为s t a t e statestate,他可以翻转三块石头中的任意一块。翻转第k kk块石头(k = 0 , 1 , 2 k = 0,1,2k=0,1,2)会得到新状态n e x t S t a t e = s t a t e ⊕ ( 1 ≪ k ) nextState = state \oplus (1 \ll k)nextState=state(1k)(异或操作翻转对应位)。然后,第i + 1 i+1i+1位祭司在该状态下的最终结果是d p [ i + 1 ] [ n e x t S t a t e ] dp[i+1][nextState]dp[i+1][nextState]。第i ii位祭司会从这三种可能的n e x t S t a t e nextStatenextState中,选择使自己的偏好值最小(即最喜欢)的那个最终结果作为自己的选择,并将该结果记录在d p [ i ] [ s t a t e ] dp[i][state]dp[i][state]中。

转移方程

d p [ i ] [ s t a t e ] = arg ⁡ min ⁡ k ∈ { 0 , 1 , 2 } p r e f e r e n c e s [ i ] [ d p [ i + 1 ] [ s t a t e ⊕ ( 1 ≪ k ) ] ] dp[i][state] = \arg\min_{k \in \{0,1,2\}} preferences[i][\,dp[i+1][\,state \oplus (1 \ll k)\,]\,]dp[i][state]=argk{0,1,2}minpreferences[i][dp[i+1][state(1k)]]

其中arg ⁡ min ⁡ \arg\minargmin返回的是对应偏好值最小的那个最终结果编号。

计算步骤

  1. 读取测试用例数n nn
  2. 对每个用例:
    • 读取祭司人数m mm
    • 读取m mm行偏好顺序,每行 8 个整数。
    • 初始化d p [ m ] [ 0..7 ] dp[m][0..7]dp[m][0..7]为对应状态值。
    • i = m − 1 i = m-1i=m10 00逆序计算d p [ i ] [ s t a t e ] dp[i][state]dp[i][state]
    • 最终d p [ 0 ] [ 0 ] dp[0][0]dp[0][0]就是从第一位祭司、初始状态NNN(即0 00)开始最终会达到的结果编号。
    • 通过outcomes数组转换为字符串输出。

复杂度分析

  • 状态数:m × 8 m \times 8m×8
  • 每个状态需要尝试3 33种翻转。
  • 总时间复杂度:O ( n × m × 8 × 3 ) = O ( 24 n m ) O(n \times m \times 8 \times 3) = O(24nm)O(n×m×8×3)=O(24nm),在n , m < 100 n, m < 100n,m<100时完全可行。
  • 空间复杂度:O ( m × 8 ) O(m \times 8)O(m×8)

代码实现

// The Uxuhul Voting System// UVa ID: 10654// Verdict: Accepted// Submission Date: 2025-12-14// UVa Run Time: 0.000s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;// 8种可能的结果字符串,索引0~7对应状态0~7conststring outcomes[]={"NNN","NNY","NYN","NYY","YNN","YNY","YYN","YYY"};intmain(){intn;cin>>n;while(n--){intm;cin>>m;vector<vector<int>>preferences(m,vector<int>(8));// 读取每位祭司的偏好顺序for(inti=0;i<m;i++)for(intj=0;j<8;j++)cin>>preferences[i][j];// dp[i][state] 表示从第i位祭司开始,当前状态为state时,最终结果的编号vector<vector<int>>dp(m+1,vector<int>(8,0));// 边界:最后一位祭司之后,状态即最终结果for(intstate=0;state<8;state++)dp[m][state]=state;// 逆序DP,从最后一位祭司往前推for(inti=m-1;i>=0;i--){for(intstate=0;state<8;state++){intbestPreference=INT_MAX;// 偏好值越小越好intbestOutcome=-1;// 尝试翻转三块石头中的一块for(intflip=0;flip<3;flip++){intnextState=state^(1<<flip);// 翻转第flip位intfinalOutcome=dp[i+1][nextState];// 后续祭司的最终结果// 选择对自己最有利的(偏好值最小)if(preferences[i][finalOutcome]<bestPreference){bestPreference=preferences[i][finalOutcome];bestOutcome=finalOutcome;}}dp[i][state]=bestOutcome;}}// 输出从第一位祭司、初始状态0(NNN)开始的最终结果cout<<outcomes[dp[0][0]]<<endl;}return0;}

总结

本题是一个典型的逆向动态规划问题,关键在于理解每位祭司的决策依赖于后续祭司的最优选择。通过从最后一位祭司开始向前递推,我们可以确定在任意状态下最终会达到的结果。最终答案即为d p [ 0 ] [ 0 ] dp[0][0]dp[0][0]对应的结果字符串。

这种“逆推最优决策”的思想在博弈论和动态规划中非常常见,本题提供了一个很好的应用实例。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/5 11:13:58

UniEdit:首个大型开放域大模型知识编辑基准

随着大语言模型&#xff08;LLM&#xff09;的广泛应用&#xff0c;它们在医疗、金融、教育等关键行业扮演着愈发重要的角色。然而&#xff0c;一个被忽视的现实是&#xff1a;大模型的知识并不会自动更新&#xff0c;更不总是准确。当模型输出过时信息、错误事实甚至自信满满的…

作者头像 李华
网站建设 2026/3/10 8:39:56

GitHub项目推荐:基于Qwen3-VL-8B开发的开源图像描述器

基于Qwen3-VL-8B的开源图像描述器&#xff1a;轻量级多模态落地新选择 在电商后台自动为商品图生成文案、客服系统读懂用户上传的报错截图、内容平台快速识别潜在违规画面——这些曾被视为“高阶AI能力”的场景&#xff0c;如今正随着轻量级多模态模型的成熟变得触手可及。过去…

作者头像 李华
网站建设 2026/3/10 11:41:45

告别论文焦虑!2025年一大AI论文神器实测报告(附教程)_aibijiang 论文

熬夜、秃头、颈椎疼&#xff0c;还要被导师追着问进度——这大概就是每个大学生写论文时的真实写照。 曾几何时&#xff0c;一篇论文从开题到完成&#xff0c;花费数月甚至一两年都是常事。 而今天&#xff0c;一切都变了。竟然真的有人能在几天之内完成一篇高质量的学术论文…

作者头像 李华
网站建设 2026/3/5 0:14:08

WordPress myCred插件关键权限缺失漏洞:CVE-2025-12362技术分析

CVE-2025-12362: myCred WordPress插件中的CWE-862权限缺失漏洞 严重性&#xff1a;中等 类型&#xff1a;漏洞 CVE编号&#xff1a; CVE-2025-12362 漏洞描述 WordPress的“myCred – 用于游戏化、等级、徽章和忠诚度计划的积分管理系统”插件在2.9.7及之前的所有版本中存在“…

作者头像 李华
网站建设 2026/3/5 3:33:17

当生成式AI成为逆向工程的加速器:揭秘XLoader恶意软件分析

以快制快&#xff1a;利用生成式AI加速逆向工程XLoader 2025年11月3日 研究作者: Alexey Bukhteyev 核心要点 XLoader 仍是目前最难分析的恶意软件家族之一。其代码仅在运行时解密&#xff0c;并受多层加密保护&#xff0c;每一层都使用隐藏在二进制文件不同位置的密钥。即使是…

作者头像 李华
网站建设 2026/3/5 11:06:36

Wireshark 4.6.2 发布:修复两处安全漏洞,关键网络分析工具迎来重要更新

技术摘要 Wireshark 4.6.2 是一个维护版本&#xff0c;修复了两个安全漏洞和五个错误。尽管提供的资料未详细说明漏洞的具体性质&#xff0c;但中等严重性评级表明&#xff0c;它们可能在中等程度上影响机密性、完整性或可用性。此次更新还更改了 Windows 安装程序的打包方式&a…

作者头像 李华