小明参加了少年宫的一项趣味活动:
每个小朋友发给一个空白的骰子(它的6个面是空白的,没有数字),要小朋友自己设计每个面写哪个数字。但有如下要求:
1. 每个面只能填写 0 至 8 中的某一个数字。
2. 不同面可以填写同样的数字,但6个面总和必须等于24。
填好后,小朋友可以用自己填写好数字的骰子向少年宫的两个机器人挑战----玩掷骰子游戏。规则如下:
三方同时掷出自己的骰子,如果出现任何相同的数字,则三方都不计分。
如果三方数字都不同,则最小数字一方扣 1 分,最大数字一方加 1 分。
小明看到了两个机器人手中的骰子分别是:
0 0 0 8 8 8
1 1 4 5 6 7
请你替小明算一下,他如何填写,才能使自己得分的概率最大。
请提交小明应该填写的6个数字,按升序排列,数字间用一个空格分开。
如果认为有多个答案,提交字母序最小的那个方案。
请严格按照格式,通过浏览器提交答案。
答案:2 2 2 2 8 8
这道题我也不知道这种做法对不对,反正结果是出来了
因为小明只需要6中选择,所以完全可以套6层循环跑一跑所有的情况
然后就是怎么判断了,首先这6个数的和得是24,其次就是得分的概率最大,因为我们已经知道了另外两个机器人手里的点数了,所以我们可以挨个判断,当小明手里的点数对应得分的概率
第一个机器人 手里只有两种点数
0 概率 1/2;
8 概率 1/2;
第二个机器人手里有5种点数
1 概率 1/3;
4 概率 1/6;
5 概率 1/6;
6 概率 1/6;
7 概率 1/6;
然后就是看小明手里的点数了
0 得分的概率 0 丢分的概率 1/2
1 得分的概率 0 丢分的概率 1/3
2 得分的概率 1/6 丢分的概率 1/3
3 得分的概率 1/6 丢分的概率 1/3
4 得分的概率 1/6 丢分的概率 1/4
5 得分的概率 1/4 丢分的概率 1/6
6 得分的概率 1/3 丢分的概率 1/12
7 得分的概率 5/12 丢分的概率 0
8 得分的概率 1/2 丢分的概率 0
然后我们把所有概率乘以12,得分是正数,丢分是负数,相加,可以得到一个小明手里点数对应得分的权值数组
如下:
int pre[10]={-6,-4,-2,-2,-1,1,3,5,6};
然后就可以暴力枚举了,找到得分权值最大的选择:
#include<iostream>
#include<cstring>
using namespace std;
int pre[10]={-6,-4,-2,-2,-1,1,3,5,6};
int Max=-9999;
string s;
int main(){
for(int a=0;a<=8;a++){
for(int b=0;b<=8;b++){
for(int c=0;c<=8;c++){
for(int d=0;d<=8;d++){
for(int e=0;e<=8;e++){
for(int f=0;f<=8;f++){
if(a+b+c+d+e+f==24){
int temp=pre[a]+pre[b]+pre[c]+pre[d]+pre[e]+pre[f];
if(temp>Max){
Max=temp;
cout<<Max<<endl;
cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<endl;
}
}
}
}
}
}
}
}
cout<<"_______________"<<endl;
cout<<Max<<endl;
return 0;
}