剑指Offer - 九度1360 - 乐透之猜数游戏
剑指Offer - 九度1360 - 乐透之猜数游戏
2014-02-05 19:54
- 题目描述:
-
六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工。为了增添一点趣味性,他还准备了一些不同类型的骰子,打算以掷骰子猜数字的方式发放奖品。例如,有的骰子有6个点数(点数分别为1~6),有的骰子有7个(点数分别为1~7),还有一些是8个点数(点数分别为1~8) 。他每次从中拿出n个同一类型的骰子(假设它们都是拥有m个点数并且出现概率相同)投掷,然后让员工在纸上按优先级(从高到低)的顺序写下3个数上交,表示他们认为这些骰子最有可能的点数之和是多少。第一个数就猜对的人,是一等奖;第二个数才猜对的人是二等奖;如果三个数都不是正确答案,别灰心!YZ还准备了很多棒棒糖。ZL很聪明,他想了想,打算把概率(以保留两位小数的概率计)最高的三个数找出来,如果有概率相同,则选择其中点数和最小的那个数。你觉得ZL会依次写下哪三个数?
- 输入:
-
输入有多组数据。
每组数据一行,包含2个整数n(0<=n<=10),m(6<=m<=8),n表示YZ拿出的骰子数,m表示骰子拥有的点数。如果n=0,则结束输入。
- 输出:
-
对应每组数据,输出ZL最可能依次写下的点数,以及其对应的概率值。概率值按4舍5入要求保留2位小数。每组数据之间空一行,注意:最后一组数据末尾无空行。
- 样例输入:
-
1 6
4 6
3 7
0
- 样例输出:
-
1 0.17
2 0.17
3 0.17 13 0.11
14 0.11
15 0.11 12 0.11
10 0.10
11 0.10
题意分析: 扔骰(tou,不是shai)子求点数应该也是很常见的概率问题了。对于一个点数范围1~m的骰子,扔了n次,求出点数之和概率最大的三个值,以及对应的概率。
首先,扔一次获得各个点数的概率是相等的,因此各点数之和的概率分布一定是对称的,所以概率最大的一定就是正中间的三个点数和。因此,均值n*(1+m)/2就是概率最大的。考虑到奇偶和取整问题,在n奇m偶的情况下,概率最大的点数有两个。
如果你做过另一个题:求x+y+z=n的非负整数解,应该会想在这题上试试用组合数学来搞出个巧妙解法。但由于这道题中限制每个数都在1~m的范围内,需要分情况处理。所以我还是决定用n^2*m规模的动态规划来解决。
k个骰子能扔出的点数之和最小是k,最大是m*k,因此只要知道了k-1个骰子的所有扔法,就能推导出k个骰子的所有扔法的概率分布。
递推公式为:
1. 用a[n][k]表示n个骰子扔出的点数和为k的扔法个数。
2. a[1][j]=1, j=[1,m]
3. a[i][j]=sigma(a[i-1][k]), j=[i,i*m], k∈[i-1,(i-1)*m]∩[j-m,j-1]
由于递推需要进行n轮,每轮的点数之和从i到i*m。所以时间复杂度是O(n*(n*m)),也就是O(n^2*m),空间复杂度可以优化为O(n*m),不过本题中n和m都比较小,所以我没有进一步优化。
最后需要注意的,是对算出来的概率四舍五日到小数点后两位,然后再比较概率。
// 689492 zhuli19901106 1360 Accepted 点击此处查看所有case的执行结果 1024KB 1230B 10MS
//
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std; typedef struct st{
public:
int x;
int y;
st(int _x = , int _y = ): x(_x), y(_y) {};
}st; bool comparator(const st &a, const st &b)
{
if (a.y == b.y) {
return a.x < b.x;
} else {
return a.y > b.y;
}
} int main()
{
int n, m;
int i, j, k;
int sum;
int a[][];
vector<st> v;
int cc; cc = ;
while (scanf("%d", &n) == && n) {
scanf("%d", &m);
if (cc > ) {
printf("\n");
}
++cc;
memset(a, , * * sizeof(int));
for (i = ; i <= m; ++i) {
a[][i] = ;
}
sum = m;
for (i = ; i <= n; ++i) {
for (j = ; j <= m; ++j) {
for (k = i - ; k <= (i - ) * m; ++k) {
a[i][k + j] += a[i - ][k];
}
}
sum *= m;
} for (i = n; i <= n * m; ++i) {
v.push_back(st(i, (int)(100.0 * a[n][i] / sum + 0.5)));
} sort(v.begin(), v.end(), comparator); for (i = ; i < ; ++i) {
printf("%d %.2f\n", v[i].x, v[i].y / 100.0);
}
v.clear();
} return ;
}
剑指Offer - 九度1360 - 乐透之猜数游戏的更多相关文章
- 剑指Offer - 九度1524 - 复杂链表的复制
剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...
- 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先
剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...
- 剑指Offer - 九度1508 - 把字符串转换成整数
剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...
- 剑指Offer - 九度1504 - 把数组排成最小的数
剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...
- 剑指Offer - 九度1503 - 二叉搜索树与双向链表
剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...
- 剑指Offer - 九度1390 - 矩形覆盖
剑指Offer - 九度1390 - 矩形覆盖2014-02-05 23:27 题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形 ...
- 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...
- 剑指Offer - 九度1369 - 字符串的排列
剑指Offer - 九度1369 - 字符串的排列2014-02-05 21:12 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所 ...
- 剑指Offer - 九度1366 - 栈的压入、弹出序列
剑指Offer - 九度1366 - 栈的压入.弹出序列2014-02-05 20:41 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所 ...
随机推荐
- Vim中根据正则对选中文本对齐(比如ini文件的=号对齐)
vimrc增加如下内容即可: vnoremap <M-=> :call Duiqi('\v(^\s*\S+)\s+(.*)')<CR> "reg匹配的第2段文字对齐 ...
- AFNetworking 初探
AFNetworking 初探 繼ASIHTTPRequest發佈不再維護的訊息之後,如果我們不使用CDN(雲端伺服器),AFNetworking 會是一套不錯的選擇.下載網址:https://git ...
- SQL SERVER 下:1、递归查询父分类下的各个子分类。 2、查询每个商品分类中最贵的前两个商品SQL
1.递归查询父分类下的各个子分类.表设计: SQL: --CTE 语句(适用于MSSQL2005以后版本) with cte_testNavi(Id,Name,Pid ) as ( --这是查询语句 ...
- ssh key一键自动化生成公钥私钥,并自动分发上百服务器免密码交互
题记:由于工作需要管理大量服务器,所以需要配公钥实现免密登录. ssh批量分发可以一键执行这个操作,但是使用ssh分发服务还需要对各个服务器进行.ssh/id_dsa.pub公钥上传,密码验证.所以需 ...
- c# 语法 字符串内插
结果截屏 参考文章 https://www.cnblogs.com/csproj/p/Interpolated_Strings.html c# 6.0语法 https://www.cnblogs.co ...
- Intel MKL 多线程设置
对于多核程序,多线程对于程序的性能至关重要. 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍: 我们提到MKL 支持多线程,它包括的两个概念:1>MKL 是线程安全的: MKL ...
- 创建Android环境并且安装cordova
需要eclipse.Andriod SDK.java.Apache ant.Node.js.Genymotion 目录链接: 1.安装adt-eclipse 2.安装JAVA 3.安装Apache a ...
- C#操作Word,写数据,插入图片
本篇介绍的是如何在C#中往word里面写入数据. 如何在线的操作文档: c#在线操作文档 关于Aspose.Word控件的介绍,请戳→ 介绍 首先需要去下载这个dll文件,然后引用到你的项目当中.地 ...
- MyEclipse中安装findBugs插件(摘)
安装方法如下: 1.首先从findbugs网站下载插件:http://findbugs.sourceforge.net/downloads.html 2.将下载回来的zip包解压,得到文件夹:edu. ...
- 11_1_GUI
11_1_GUI 1. AWT AWT(Abstract Window Toolkit)包括了很多类和接口,用于Java Application的GUI(Graphics User Interface ...