骰子游戏(2023睿抗省赛)

骰子游戏
在这里插入图片描述

题目描述:

在某个游戏中有一个骰子游戏。

在游戏中,你需要投掷 5 个标准六面骰子(骰子为一个正方体,6个面上分别有 1、2、3、4、5、6中的一个数字,骰子的质量均匀),投出的点数根据组合会获得一个“获胜等级”。

获胜等级从高到低如下:

  • 五个同点数 - 五个骰子显示相同的点数
  • 四个同点数 - 四个骰子显示相同的点数
  • 葫芦 - 一对和一个三个同点数(如 1、1、3、3、3)
  • 六高顺子 - 投出的点数为 2、3、4、5、6
  • 五高顺子 - 投出的点数为 1、2、3、4、5
  • 三个同点数 - 三个骰子显示相同的点数(如 1、1、1、2、3)
  • 两对 - 投出的点数中有两对是相同的(如 1、1、2、2、3)
  • 一对 - 投出的点数有一对是相同的(如 1、1、2、3、4)
  • 无 - 除去以上的其他情况

给定你已经投出的一次结果,现在假设你可以选择任意个骰子重投一次,请问怎么样操作,才能最大化在重骰后获得更好的获胜等级的概率呢?

注意:更好的获胜等级需要严格地比当前的获胜等级更好,例如 1、1、2、2、3如果重骰后变为 1、1、3、3、4并不比当前的获胜等级更好。

输入格式

输入第一行是一个正整数 TT,表示接下来有多少组数据。

每组数据只有一行 5 个数字,表示第一次投出的 5个骰子的点数。

输出格式

对于每组数据输出三个整数,其中第一个整数为为了获得最大的概率需要重新骰几个骰子,后面的两个整数为重骰骰子后概率的最简分数,其中第二个整数为分子,第三个整数为分母。如果分子为 00,分母为 11。

如果有多种获得最大概率的情况,取重骰的骰子数最少的方案。

数据范围

1 ≤ T ≤ 10 1 \le T \le 10 1T10

输入样例:
3
1 1 2 2 3
1 1 2 3 4
1 1 1 2 3
输出样例:
3 4 9
3 13 18
2 4 9

思路:

  1. 枚举所有 2^5 子集:选择哪些骰子重投。
  2. 对每个子集,暴力枚举 6^k 种可能的重投结果(dfs),计算严格优于当前等级的次数 win
  3. 记录并更新 最大概率 以及对应的最小重投骰子k
  4. 最后将 win/6^k 化简为最简分数输出。

枚举“要重投的骰子子集”
用一个 5 位二进制掩码 mask,从 031 共 32 种可能。掩码的第 i 位是 1 就表示“第 i 个骰子要重投”,否则保留原值。

模拟重投结果
对于选中要重投的那 k 个骰子,共有 6^k 种可能的新点数组合。我们用一次深度优先搜索(DFS)把所有可能枚举出来,统计其中“等级 > 原等级”的次数 win

计算概率并挑最优

  • win 次成功中,“赢”的概率就是 win / 6^k
  • 在所有 32 种 mask 中,挑出概率最大的一个;若有并列,就挑 k(重投骰子个数)最小的。

化简分数输出
最后把分子 win、分母 6^k 作最大公约数约分,输出最简分数。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;// Rank levels
// 0: nothing
// 1: one pair
// 2: two pair
// 3: three of a kind
// 4: 5-high straight (1-5)
// 5: 6-high straight (2-6)
// 6: full house
// 7: four of a kind
// 8: five of a kind
//给定序列返回等级.
int rank_of(const array<int,5> &dice) {int cnt[7]={0};for(int x:dice) cnt[x]++;vector<int> freqs;for(int v=1;v<=6;v++) if(cnt[v]>0) freqs.push_back(cnt[v]);sort(freqs.begin(), freqs.end(), greater<int>());// fiveif(freqs[0]==5) return 8;// fourif(freqs[0]==4) return 7;// full houseif(freqs[0]==3 && freqs.size()==2 && freqs[1]==2) return 6;// straights// check 2-6bool ok=true;for(int v=2;v<=6;v++) if(cnt[v]!=1) ok=false;if(ok) return 5;ok=true;for(int v=1;v<=5;v++) if(cnt[v]!=1) ok=false;if(ok) return 4;// threeif(freqs[0]==3) return 3;// two pairif(freqs[0]==2 && freqs.size()==3 && freqs[1]==2) return 2;// one pairif(freqs[0]==2) return 1;return 0;
}// gcd
ll gcdll(ll a, ll b){ return b?gcdll(b,a%b):a; }int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin>>T;while(T--){array<int,5> init;for(int i=0;i<5;i++) cin>>init[i];int cur_rank = rank_of(init);double best_prob = -1;int best_k = 0;ll best_num=0, best_den=1;for(int mask=0;mask<32;mask++){//mask使用二进制表示,其中位为1的表示这个位要重新骰.要遍历32次哦vector<int> idx;//idx存储要骰的是第几个骰子.(取值表示下标:1-5)for(int i=0;i<5;i++) if(mask & (1<<i)) idx.push_back(i);//放的i!!!int k = idx.size();//要重新骰的数量ll total = 1;//一共会有多少种可能.for(int i=0;i<k;i++) total *= 6;ll win = 0;//这些可能中,会有多少比原来的等级严格高array<int,5> dice = init;//dice记录原来的骰子情况,在搜索时要修改function<void(int)> dfs = [&](int pos){if(pos==k){// 如果搜索到要骰的最后一个位置就要判断,相当于index==n时结束递归int r = rank_of(dice);if(r > cur_rank) win++;return;}//如果还没有到头就开始遍历这个位置上的数字.从1-6int i = idx[pos];//第i个位置要重新骰for(int d=1;d<=6;d++){dice[i]=d;dfs(pos+1);//这个位置已经重置完成了,继续遍历下一个位置.}};dfs(0);// 计算比原来好的可能性double prob = (double)win / (double)total;if(prob > best_prob + 1e-15 ||(abs(prob - best_prob)<1e-15 && k < best_k)) {best_prob = prob;best_k = k;best_num = win;//分子best_den = total;//分母}}// 化简if(best_num==0) best_den=1;else {ll g = gcdll(best_num, best_den);best_num/=g; best_den/=g;}cout<<best_k<<" "<<best_num<<" "<<best_den<<"\n";}return 0;
}

这个题目怎么说呢,根据那个给出的 T T T的范围,可以估计一下会使用暴力搜索,所以估计的复杂度为:
C 5 1 ∗ 6 + C 5 2 ∗ 6 2 + . . . . . + C 5 4 ∗ 6 4 + C 5 5 ∗ 6 5 ≈ 1 0 , 251 C_5^1*6+C_5^2*6^2+.....+C_5^4*6^4+C_5^5*6^5 \approx \text10,251 C516+C5262+.....+C5464+C556510,251
102510 < 10 8 102510<10^8 102510<108基本可以在一秒以内跑完的

这个题当做感叹吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/906952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMake跨平台编译生成:从理论到实战

一、引言 在当今软件开发中&#xff0c;跨平台开发已成为常态。无论是需要在Windows、Linux、macOS等多操作系统上运行&#xff0c;还是在不同的硬件架构&#xff08;如x86、ARM等&#xff09;间部署&#xff0c;跨平台编译生成都是一个无法回避的关键问题。CMake&#xff0c;…

Python经典算法实战

在编程的世界里&#xff0c;算法是解决问题的灵魂&#xff0c;而Python以其简洁优雅的语法成为实现算法的理想语言。无论你是初学者还是有一定经验的开发者&#xff0c;《Python经典算法实战》都能带你深入算法的殿堂&#xff0c;从理论到实践&#xff0c;一步步构建起扎实的编…

QT的自定义控件

1.比如对label控件进行提升为QPaintPointLabel类&#xff0c;基类选择QLabel&#xff0c;头文件建议加上相对路径&#xff0c;有时候VS识别不出来直接的头文件&#xff0c;在提升的类中重写pointEvent&#xff08;&#xff09;函数。

flutter 常用组件详细介绍、屏幕适配方案

一、常用组件 1.基础组件 组件说明示例Text显示文本Text(‘Hello Flutter’, style: TextStyle(fontSize: 20))Image显示图片Image.network(‘https://example.com/image.jpg’)Icon显示图标Icon(Icons.home, size: 30, color: Colors.blue)RaisedButton / ElevatedButton按钮…

leetcode 17. Letter Combinations of a Phone Number

题目描述 17. Letter Combinations of a Phone Number 代码&#xff1a; class Solution {string table[10] {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz&qu…

Web前端大模型实战:端侧翻译+朗读流程线+模型音频数据编码 - 让网站快速支持多语言多模态输出

在以前的文章 前端大模型入门&#xff1a;实战篇之Vue3Antdvtransformers本地模型实现增强搜索 中介绍了前端使用大模型的文本RAG实现。本文将更进一步&#xff0c;介绍多模态输出的端侧实现。 本文将通过端侧大模型技术实现网页端的实时翻译与语音合成功能&#xff0c;无需服…

Python包管理工具uv 国内源配置

macOS 下 .config/uv/uv.toml内 pip源 [[index]] url "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/" default true#uv python install 下载源配置无效&#xff0c;需要在项目里配置 # python-install-mirror "https://mirror.nju.edu.cn/githu…

用户有一个Django模型没有设置主键,现在需要设置主键。

用户有一个Django模型没有设置主键&#xff0c;现在需要设置主键。 from django.db import modelsclass CategoryAssistentModel(models.Model):second_level_category models.CharField(max_length100, nullTrue, blankTrue)third_level_category models.CharField(max_len…

搭建 C/C++_CMake_Boost_git 开发环境

搭建 C 开发环境 步骤 1&#xff1a;启动 Ubuntu 18.04 容器 创建并启动一个 Ubuntu 18.04 容器&#xff1a; docker run -itd --name cppubuntu ubuntu:18.04-itd&#xff1a;以交互模式运行容器&#xff0c;并在后台运行。--name cppubuntu&#xff1a;命名容器为 cppubun…

OceanBase数据库全面指南(查询进阶篇DQL)

文章目录 一、OceanBase条件查询详解——WHERE子句的艺术1.1 WHERE子句基础语法与原理1.2 基础条件查询实战1.3 高级条件表达式1.4 分布式环境下的条件查询优化二、OceanBase排序查询——ORDER BY深度解析2.1 ORDER BY基础与执行原理2.2 单字段排序实战2.3 多字段复杂排序2.4 排…

.NET 10 - 尝试一下Minimal Api的Validation新特性

1.简单介绍 2025年11月微软将会发布.NET10&#xff0c;这是LTS(Long Term Support)版本。当前.NET10已经处于Preview4版本&#xff0c;微软对Runtime, Library, SDK, C#, Asp.NET Core, MAUI等都做了很多enhancement。近些年微软对Minimal Api一直在持续地更新。在.NET8中, Mi…

vue+threeJS 创建镂空球体(SphereGeometry)

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vuethreeJS 创建镂空球体&#xff08;SphereGeometry&#xff09;”。 上次看到一个做镂空球体的项目&#xff0c;自己也准备尝试着做一做。今天终于做完了&#xff0c;并对这个项目进行梳理。 镂空球体示例效果…

Docker 镜像打包到本地

保存镜像 使用 docker save 命令将镜像保存为一个 tar 文件。命令格式如下&#xff1a; docker save [options] IMAGE [IMAGE...]示例&#xff1a;docker save -o centos.tar centos:latest--output 或 -o&#xff1a;将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…

前端常见的安全问题

跨站脚本攻击(XSS) XSS&#xff08;跨站脚本攻击&#xff0c;Cross-Site Scripting&#xff09;是一种通过在网页中注入恶意脚本&#xff0c;从而窃取用户数据或控制用户行为的攻击方式。注入的js跟网页与原有的js具有同样的权限&#xff0c;可以获得server端数据、可以获取co…

Spring Boot与Disruptor高性能队列整合指南

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、Disruptor简介 Disruptor是LMAX公司开发的高性能无锁队列框架&#xff0c;其核心设计通过以下特性实现卓越性能&#xff1a; 环形数组结构&#xff08;…

MongoDB CRUD操作完全指南:从入门到精通

在当今数据驱动的时代&#xff0c;数据库管理系统扮演着至关重要的角色。作为最受欢迎的NoSQL数据库之一&#xff0c;MongoDB以其灵活的数据模型、卓越的可扩展性和强大的查询能力赢得了开发者的青睐。本文将全面介绍MongoDB的核心操作——CRUD&#xff08;创建、读取、更新、删…

2025/5/25 学习日记 linux进阶命令学习

tree:以树状结构显示目录下的文件和子目录&#xff0c;方便直观查看文件系统结构。 -d&#xff1a;仅显示目录&#xff0c;不显示文件。-L [层数]&#xff1a;限制显示的目录层级&#xff08;如 -L 2 表示显示当前目录下 2 层子目录&#xff09;。-h&#xff1a;以人类可读的格…

quickbi实现关联度分析(复刻PowerBI展示)

quickbi实现关联度分析&#xff08;复刻PowerBI展示&#xff09; PowerBI通过DAX创建度量值&#xff0c;可以比较轻松的实现不同产品的关联度分析&#xff0c;即购物篮分析&#xff0c;但如果使用quickbi&#xff0c;则需要通过sql代码创建一个数据集&#xff0c;然后再通过数…

git 把一个分支A的某一个 commit 应用到另一个分支B上

先记住分支 A 上你要应用的那个 commit <commit_id> checkout 到分支 B git cherry-pick <commit_id>完成

基于Python的分布式网络爬虫系统设计与实现

摘要 随着互联网信息爆炸性增长&#xff0c;大规模数据采集与分析需求日益增加。本文设计并实现了一套基于Python的分布式网络爬虫系统&#xff0c;采用图形用户界面实现便捷操作&#xff0c;集成异步IO技术与多线程处理机制&#xff0c;有效解决了传统爬虫在数据获取、处理效…