骰子游戲(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 C51??6+C52??62+.....+C54??64+C55??6510,251
102510 < 10 8 102510<10^8 102510<108基本可以在一秒以內跑完的

這個題當做感嘆吧!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906952.shtml
英文地址,請注明出處:http://en.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;有效解決了傳統爬蟲在數據獲取、處理效…