玩骰子
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 836 Accepted Submission(s): 234
Problem Description
Nias与Ains都特别喜欢玩骰子,而且都自以为比对方玩得更溜。
终于有一天,他们决定用骰子来一决高下!
一般的骰子玩法已经不足以体现他们的水平了,于是他们自创了一套玩法来PK:
首先,每人掷3个骰子;之后,可以选择其中一个骰子重新掷(当然也可以放弃这一步),最后,比较投掷结果的大小,结果大的那方获胜,一样的话为平局。
大小比较规则为:
三个一样数字的骰子称为三条;两个一样数字的骰子称为对子;只有一个数字的骰子成为散牌。三条>对子>散牌。当双方结果都为三条时,直接比较三条数字的大小;都有对子时,先比较对子数字的大小,若相同,再比较剩下的骰子的数字的大小;都只有散牌时,先比较最大的数字的大小,若相同,再比较次大的数字的大小,还相同,最后比较最小的数字的大小。
现在Nias已经投了3个骰子,还剩一次机会可以选择其中一个骰子重新投(或不选),而且他已经知道了Ains的最后投掷结果,求Nias获胜的概率有多大。
终于有一天,他们决定用骰子来一决高下!
一般的骰子玩法已经不足以体现他们的水平了,于是他们自创了一套玩法来PK:
首先,每人掷3个骰子;之后,可以选择其中一个骰子重新掷(当然也可以放弃这一步),最后,比较投掷结果的大小,结果大的那方获胜,一样的话为平局。
大小比较规则为:
三个一样数字的骰子称为三条;两个一样数字的骰子称为对子;只有一个数字的骰子成为散牌。三条>对子>散牌。当双方结果都为三条时,直接比较三条数字的大小;都有对子时,先比较对子数字的大小,若相同,再比较剩下的骰子的数字的大小;都只有散牌时,先比较最大的数字的大小,若相同,再比较次大的数字的大小,还相同,最后比较最小的数字的大小。
现在Nias已经投了3个骰子,还剩一次机会可以选择其中一个骰子重新投(或不选),而且他已经知道了Ains的最后投掷结果,求Nias获胜的概率有多大。
Input
输入数据第一行为一个整数T,表示有T组测试数据。
接下来T行,每行6个1~6的整数,前三个表示Nias第一次的投掷结果,后三个表示Aias最终的投掷结果。
接下来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
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int Find(int a[])
{
if(a[0]==a[1] && a[1]==a[2])
return 3;
if(a[0]==a[1] || a[1]==a[2])
return 2;
return 1;
}
void FuZhi(int a[], int A[])
{
for(int i=0; i<3; i++)
A[i] = a[i];
}
bool Judge(int a[], int b[])
{
sort(a,a+3);
sort(b,b+3);
int A = Find(a), B = Find(b);
if(A>B) return true;
if(A<B) return false;
if(A==3)
return a[0]>b[0];
if(A==2)
{
int ak, bk;
if(a[1]>b[1]) return true;
if(a[1]<b[1]) return false;
if(a[0]!=a[1]) ak = a[0];
else ak = a[2];
if(b[0]!=b[1]) bk = b[0];
else bk = b[2];
return ak>bk;
}
if(A==1)
{
if(a[2]>b[2]) return true;
if(a[2]<b[2]) return false;
if(a[1]>b[1]) return true;
if(a[1]<b[1]) return false;
return a[0]>b[0];
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int a[4], b[4], A[4], B[4], i, j, w, Max = 0;
scanf("%d%d%d%d%d%d", &a[0], &a[1], &a[2], &b[0], &b[1], &b[2]);
if(Judge(a, b))
printf("1.000\n");
else
{
for(i=0; i<3; i++)
{
w = 0;
for(j=1; j<=6; j++)
{
FuZhi(a, A);
FuZhi(b, B);
A[i] = j;
if(Judge(A, B))
w++;
}
Max = max(Max, w);
}
printf("%.3f\n", 1.0*Max/6);
}
}
return 0;
}
勿忘初心