【剑指Offer面试编程题】题目1360:乐透之猜数游戏--九度OJ
- 题目描述:
-
六一儿童节到了,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
【解题思路】本题的概率等于次数除以总的次数,所以,我们可以记录次数,这样更加简单。然后,我们发现每投掷一次得到的次数,都与前面几次有关系,所以我们可以总结该问题为dp问题。
我们可以设aa[i][j]代码投掷i次,得到总和为j的次数。那么aa[i][j]+=aa[i-1][j-k],其中k为第i次单个骰子的出现的点数,j为之前所出现的点数。建立dp连接式我们可以很快得到结果。当然最后我们需要先算出四舍五入的概率后再排序。
AC code:
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std; struct st
{
int idx,val;
double vl;
}; bool cmp(const st &s1,const st &s2)
{
if(s1.val!=s2.val)
return s1.val>s2.val;
else
return s1.idx<s2.idx;
} int main()
{
int n,m;
bool pt=false;
int aa[11][81];
while(scanf("%d",&n)!=EOF && n>0)
{
scanf("%d",&m);
memset(aa,0,11*81*sizeof(int));
for(int i=1;i<=m;++i)
aa[1][i]=1;
int all=m;
for(int i=2;i<=n;++i)
{
for(int k=1;k<=m;++k)
{
for(int j=i-1;j<=(i-1)*m;++j)
aa[i][j+k]+=aa[i-1][j];
}
all*=m;
}
vector<st> vecin;
for(int i=n;i<=n*m;++i)
{
st ts;
ts.idx=i;
ts.val=aa[n][i];
vecin.push_back(ts);
}
int ep=pow(m*1.,n);
for(int i=0;i<vecin.size();++i)
{
vecin[i].vl=vecin[i].val*1./ep;
int tt=(vecin[i].vl+0.005)*100;
vecin[i].vl=tt*1./100;
vecin[i].val=tt%100;
}
sort(vecin.begin(),vecin.end(),cmp);
if(pt)printf("\n");
pt=true;
for(int i=0;i<3;++i)
{
printf("%d %.2f\n",vecin[i].idx,vecin[i].vl);
}
}
return 0;
}
/**************************************************************
Problem: 1360
User: huo_yao
Language: C++
Result: Accepted
Time:0 ms
Memory:1024 kb
****************************************************************/
题目链接:http://ac.jobdu.com/problem.php?pid=1360 九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299
【剑指Offer面试编程题】题目1360:乐透之猜数游戏--九度OJ的更多相关文章
- 剑指Offer - 九度1360 - 乐透之猜数游戏
剑指Offer - 九度1360 - 乐透之猜数游戏2014-02-05 19:54 题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备 ...
- 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ
题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...
- 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...
- 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...
- 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...
- 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ
题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...
- 【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
- 【剑指Offer面试编程题】题目1362:左旋转字符串--九度OJ
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&qu ...
- 【剑指Offer面试编程题】题目1361:翻转单词顺序--九度OJ
题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,&quo ...
随机推荐
- MYSQL内置函数【转】
一.MySQL 字符串函数 函数 描述 实例 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码. 返回 CustomerName 字段第一个字母的 ASCII 码: SELECT AS ...
- LinuxC下argv,argc[]的意义
MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
- [AST Babel Plugin] Transform code, add line:column number for console log
For example we have current code: function add(a, b) { console.log(a, b) return a + b } function sub ...
- php将数据写入另外一个文件
有时候,为了验证PHP的运行过程或者了解代码中的变量的使用情况,需要将变量写到另外一个文件中,方便我们查看.最近也是经常用到file_put_contents这个函数,因为只是试验用,暂时还不需要考虑 ...
- Travis CI Build Continuous Integration
什么是持续集成 持续集成(Continuous Integration)是经常合并小的代码更改的实践,而不是在开发周期结束时合并大的更改.目的是通过以较小的增量开发和测试来构建更健康的软件.这就是Tr ...
- 树莓派安装raspbian并配置开发环境
1.烧录系统 首先准备好我们要烧录的raspbian系统,可以在树莓派官网中下载https://www.raspberrypi.org/downloads/ 这里我们选择 2018-11-13-ras ...
- 吴裕雄 PYTHON 神经网络——TENSORFLOW 单隐藏层自编码器设计处理MNIST手写数字数据集并使用TensorBord描绘神经网络数据
import os import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from tensorflow ...
- ztree-拖拽(排序树)
<!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - beforeDrag / onDrag / bef ...
- ES-Result window is too large
问题: Result window is too large 解决: PUT http://127.0.0.1:9200/catalog/_settings { "index": ...
- js将相除结果百分比 ,四舍五入函数 toFixed()
function percentNum(num, num2) { return (Math.round(num / num2 * 10000) / 100.00 + "%"); } ...