玩骰子

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1017    Accepted Submission(s): 306

Problem Description
  Nias与Ains都特别喜欢玩骰子,而且都自以为比对方玩得更溜。
  终于有一天,他们决定用骰子来一决高下!
  一般的骰子玩法已经不足以体现他们的水平了,于是他们自创了一套玩法来PK:
首先,每人掷3个骰子;之后,可以选择其中一个骰子重新掷(当然也可以放弃这一步),最后,比较投掷结果的大小,结果大的那方获胜,一样的话为平局。
  大小比较规则为:
  三个一样数字的骰子称为三条;两个一样数字的骰子称为对子;只有一个数字的骰子成为散牌。三条>对子>散牌。当双方结果都为三条时,直接比较三条数字的大小;都有对子时,先比较对子数字的大小,若相同,再比较剩下的骰子的数字的大小;都只有散牌时,先比较最大的数字的大小,若相同,再比较次大的数字的大小,还相同,最后比较最小的数字的大小。

现在Nias已经投了3个骰子,还剩一次机会可以选择其中一个骰子重新投(或不选),而且他已经知道了Ains的最后投掷结果,求Nias获胜的概率有多大。

Input
输入数据第一行为一个整数T,表示有T组测试数据。
接下来T行,每行6个1~6的整数,前三个表示Nias第一次的投掷结果,后三个表示Aias最终的投掷结果。

Output
请输出Nias获胜的概率,结果保留3位小数,每组输出占一行。

Sample Input
4
2 3 5 3 3 4
3 3 1 2 2 2
6 2 1 5 4 3
1 2 3 4 4 1

Sample Output
0.333
0.167
1.000
0.000

刚开始理解错了,以为是从3个骰子中任取一个然后掷骰子,第一个数据怎么算怎么不对,后来才知道是选定获胜几率最大的,然后掷骰子,求最大的概率,也就是选获胜可能性最大的骰子,掷之,算出其获胜概率。

对Nias的第一个骰子进行从1到6枚举,然后用一个check函数来判断是否获胜,若获胜cou++,最后cou / 6求出Nias掷这个骰子的获胜概率,同样求出第二个,第三个的获胜概率,取最大值作为结果即可。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <limits>
#include <algorithm>
#include<functional>
#include <set>using namespace std;int nias[3], ains[3];
int size = sizeof(nias);bool check(const int *n, const int *a) {int nt[3], at[3];   //因为也要保持t1的只读性否则枚举每个骰子的时候会出错memcpy(nt, n, size);memcpy(at, a, size);int cou1, cou2;set<int> s1, s2;  //用set来筛,看3个骰子中有几种骰子for (int i = 0; i < 3; i++) {s1.insert(nt[i]);s2.insert(at[i]);}cou1 = s1.size();cou2 = s2.size();if (cou1 < cou2) {  //此时nias和ains中骰子种数分别为:(2,3)或(1,3)或(1,2)nias胜return true;}else if (cou1 == cou2) {   //相等的时候分类讨论都只有1或2或3种时的情况if (cou1 == 1) {if (nt[0] > at[0])  //直接判断其中任意元素大小return true;else return false;}else if (cou1 == 2) {sort(nt, nt + 3); //先排序,排序后肯定0号或者2号元素有且只有一个和1号元素相同的sort(at, at + 3);int tem;if (nt[1] == nt[2]) {  //将相同的元素靠前放tem = nt[2];nt[2] = nt[0];nt[0] = tem;}if (at[1] == at[2]) {tem = at[2];at[2] = at[0];at[0] = tem;}if (nt[0] < at[0]) {   //先比较相同元素即“对子”大小return false;}else if (nt[0] > at[0]) {   //若相同再比较剩下的成单的return true;}else {if (nt[2] > at[2])return true;else return false;  //注意平局时不算赢}}else if (cou1 == 3) {sort(nt, nt + 3, greater<int>());   //降序排列,挨个比较sort(at, at + 3, greater<int>());for (int i = 0; i < 3; i++) {if (nt[i] > at[i])return true;else if (nt[i] < at[i])return false;}return false;  //平局}}else if (cou1 > cou2) {  //此时nias和ains中骰子种数分别为:(3,2)或(3,1)或(2,1)nias负return false;}
}double MAX(double a, double b) {if (a > b) {return a;}else {return b;}
}int main()
{int T;scanf("%d", &T);while (T--) {for (int i = 0; i < 3; i++) {scanf("%d", &nias[i]);}for (int i = 0; i < 3; i++) {scanf("%d", &ains[i]);}if (check(nias, ains)) {  //若刚开始就获胜则直接输出1.000printf("1.000\n");continue;}//t1用来临时存放nias,t2用来临时存放ains,因为中间要对数组进行改变,要一直保持nias和ains的只读性//cou用来记录获胜次数int t1[3], t2[3], cou;double maxn = -1;for (int i = 0; i < 3; i++) {memcpy(t1, nias, size);memcpy(t2, ains, size);cou = 0;for (t1[i] = 1; t1[i] <= 6; t1[i]++) {  //枚举每个骰子if (check(t1, t2)) {cou++;}}maxn = MAX(maxn, 1.0 * cou / 6);  //不断取大值}printf("%.3f\n", maxn);}return 0;
}

hdu计算机学院大学生程序设计竞赛(2015’11)1003 玩骰子相关推荐

  1. 计算机学院大学生程序设计竞赛(2015’11)1007 油菜花王国

    1007 油菜花王国 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  2. 杭电计算机学院大学生程序设计竞赛(2015’11)

    1003 玩骰子 暴力枚举抛的骰子的点数,算出获胜的方案数,然后在三个里面选择最大值. #include <bits/stdc++.h> using namespace std;int a ...

  3. 计算机学院大学生程序设计竞赛(2015’11)

    1001 搬砖(dp) 题意:把N块砖每次分成两摞,每次消耗的体力是两摞砖的差值,直到每摞只剩下一块砖,求消耗的最少体力. 思路:一开始摸不到头脑,不明白题目的意思,后来和别人讨论,一来明白了和整除2 ...

  4. 2017中国大学生程序设计竞赛 - 网络选拔赛 [1003 - Friend-Grapht] 图论

    题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=779 题目大意:给一个团队的关系图,问这个团 ...

  5. 中国矿业大学计算机学院张铖,中国矿大在第41届ACM国际大学生程序设计竞赛中国区决赛中荣获银奖...

    12月10-11日,第41届ACM国际大学生程序设计竞赛中国区决赛(ACM-ICPC Asia China-Final Contest)在上海大学举办.中国矿业大学计算机学院由刘厚泉教授担任领队,由杨 ...

  6. 上海大学计算机学院卞韬,我校计算机工程与科学学院学生在CCPC中国大学生程序设计竞赛中喜获金奖...

    CCPC中国大学生程序设计竞赛(China Collegiate Programming Contest)是由中国大学生程序设计竞赛组委会组织的年度性赛事,旨在通过竞赛来提高并展示中国大学生程序设计创 ...

  7. 绥化学院信息工程学院计算机大赛,绥化学院大学生程序设计竞赛成功举行

    原标题:绥化学院大学生程序设计竞赛成功举行 为加快我校计算机技术与科学专业.软件工程专业教学创新与改革,提高学生自主创新意识和工程实践能力,促进科技创新能力,我校于2020年10月21日15时在信息工 ...

  8. 北邮计算机学院acm,计算机学院学生在2018年ACM-ICPC中国大学生程序设计竞赛中喜获佳绩...

    6月9日至6月10日,2018ACM-ICPC中国大学生程序设计竞赛在宁夏石嘴山市举行,本次大赛吸引了来自全国各大高校的132支参赛队伍,北京邮电大学共派出三支队伍参赛,均喜获佳绩. 经过五个小时的激 ...

  9. 计算机信息技术奥赛实践,我校计算机科学与信息技术学院学生在黑龙江省大学生程序设计竞赛中取得优异成绩...

    原标题:我校计算机科学与信息技术学院学生在黑龙江省大学生程序设计竞赛中取得优异成绩 5月12日,由黑龙江省计算机学会主办.哈尔滨工业大学承办的第十四届黑龙江省大学生程序设计竞赛在哈尔滨工业大学举行,来 ...

最新文章

  1. 合理规划您的硬盘分区
  2. python三引号注释_python3学习笔记(三):注释和字符串
  3. 西部数据移动硬盘哪个型号好_飞利浦电视哪个型号好?这篇文章有你想要的答案...
  4. Linux的notifier机制在TP中的应用【转】
  5. mysql c api 封装_封装MySQL C API 基本操作
  6. 快速锁定Windows XP桌面的几个方法
  7. 消除左递归实验代码_「leetcode」669. 修剪二叉搜索树:【递归】【迭代】详解!
  8. 虚拟机Ubuntu20.04.2LTS卸载python3.8出现tty1-tty6循环登录,无法进入图形化界面,乱码(亲测)
  9. 什么软件可以测试小米四进水没有声音,小米5手机进水不用怕!牢记4个步骤救活手机...
  10. php无法清除缓冲区怎么解决,php – 无法删除缓冲区 没有缓冲区要删除
  11. Nginx的正则表达式
  12. Windows Server 2003 SP2(32位) 中文版 下载地址 光盘整合方法
  13. 一个寒门博士的论文后记:我还是没有能力让母亲安享晚年
  14. php百度网盘登录,php登陆状态百度网盘获取文件下载链接【思路|部分代码】
  15. 中专计算机的听课记录,计算机听课记录.doc
  16. Google谷歌未来如何占领“Web3高地”?
  17. 荣耀手机用什么蓝牙耳机好?适合荣耀手机的蓝牙耳机推荐
  18. DS1302时钟程序解读
  19. 计算机辅助程序英语,计算机辅助学习英语单词分组的设计
  20. 用arduino和OLED制作火柴人奔跑动画

热门文章

  1. lcd屏和oled屏哪个更护眼 lcd屏和oled屏哪个耐摔
  2. 2021年CFA一级十门科目复习流程与重点解析
  3. 操作系统真象还原实验记录之实验一:第一次编写mbr
  4. 一阶线性微分方程的格林函数通解
  5. 双时格林函数演练总结
  6. 洞悉数据分析之驾驶领导舱
  7. 工程师职称的专业分类
  8. 秃头有救了,科学家发现神奇分子SCUBE3
  9. 鲲鹏计算产业发展白皮书 附下载
  10. 粉扑怎么用如何用粉扑上粉底