题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=638
账号:team2166 密码:148090
玩骰子
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 678 Accepted Submission(s): 179
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 <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; int kind(int a[]) { if(a[1]==a[3]) return 3; if(a[1]==a[2]||a[2]==a[3]) return 2; return 1; } bool compare(int a[],int b[]) { sort(a+1,a+4); int ka=kind(a); int kb=kind(b); if(ka>kb) return true; if(ka==kb) { if(ka==3) { return a[1]>b[1]; } else if(ka==2) { if( a[2]>b[2] ) return true; if(a[2]==b[2]) { if(a[1]==a[2]&&b[1]==b[2]&&a[3]>b[3]) return true; if(a[1]==a[2]&&b[2]==b[3]) return true; if(a[2]==a[3]&&b[2]==b[3]&&a[1]>b[1]) return true; } } else { for(int i=3;i>=1;i--) { if(a[i]>b[i]) return true; else if(a[i]==b[i]) continue; else return false; } } } return false; } int main() { int t; scanf("%d",&t); int a[10],b[10],c[10]; while(t--) { scanf("%d %d %d %d %d %d",&a[1],&a[2],&a[3],&b[1],&b[2],&b[3]); sort(a+1,a+4); sort(b+1,b+4); if(compare(a,b)) printf("1.000 "); else { int Max=0; for(int i=1;i<=3;i++) { int sum=0; c[0]=0; for(int j=1;j<=6;j++) { c[i]=j; if(compare(c,b)) sum++; for(int j=1;j<=3;j++) c[j]=a[j]; } if(sum>Max) Max=sum; } printf("%.3f ",Max*1.0/6); } } }