1596: Dick.Z 的炉石赛
Time Limit: 1 Sec
Memory Limit: 128 MB
Submit: 53
Solved: 39
[ Submit][ Status][ Web Board]
Description
Dick.Z 的炉石赛
集训队即将举办一场炉石传说的积分赛,在某场比赛之前,选手必须事先决定自己三场比赛要使用的职业以及他们的出场顺序,一旦确定,出场顺序就不可以改变。获胜的场次将会记入总积分,所以即使0:2也坚持将第三场打完。而且不论前一场输赢,下一场里双方都必须更换事先决定的职业继续比赛。在这个游戏里有9种职业,9种职业互相克制。现在dick政将提供你职业之间比赛的平均胜率。请你根据两位选手预先提交的出场职业顺序计算第一位选手的期望胜场。
各职业的对战平均胜率:
我方\对方 Druid Hunter Mage Shaman Paladin Warlock Warrior Rogue Priest
Druid 0.50 0.58 0.59 0.45 0.56 0.58 0.57 0.39 0.38
Hunter 0.42 0.50 0.65 0.75 0.68 0.52 0.40 0.55 0.60
Mage 0.41 0.35 0.50 0.46 0.48 0.47 0.44 0.57 0.54
Shaman 0.55 0.25 0.54 0.50 0.53 0.51 0.63 0.52 0.42
Paladin 0.44 0.32 0.52 0.47 0.50 0.47 0.46 0.55 0.46
Warlock 0.42 0.48 0.53 0.49 0.53 0.50 0.44 0.40 0.59
Warrior 0.43 0.60 0.56 0.37 0.54 0.56 0.50 0.68 0.39
Rogue 0.61 0.45 0.43 0.48 0.45 0.60 0.32 0.50 0.48
Priest 0.62 0.40 0.46 0.58 0.54 0.41 0.61 0.52 0.50
Input
第一行包含一个整数T(1<=T<=100)
以下有T组数据,
每组包含2行,每行有三个字符串,中间用空格隔开,第一行表示第一个选手的出场顺序,第二行表示第二个选手的出场顺序。保证字符串合法
Output
对于每组数据输出一个数,表示第一位选手的期望胜场,保留2位小数。
Sample Input
2
Warrior Rogue Priest
Shaman Mage Paladin
Hunter Hunter Hunter
Shaman Shaman Shaman
Sample Output
1.34
2.25
HINT
Source
国防科学技术大学第十八届银河之光文化节ACM程序设计竞赛初赛
一道求数学期望的数学题,所以期望胜场,就是求胜利场次的期望值,具体求法就是把胜一场,胜两场,胜三场的概率分别求出来得到P1,P2,P3,然后用P1*1+P2*2+P3*3就是所要求的期望胜场,怎么说呢,拼手速吧,另外注意小数点的保留问题。
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <iomanip>
#include <algorithm>
#include <memory.h>
#include <iomanip>
using namespace std;
double avewin[9][9]=
{
0.50 , 0.58 , 0.59 ,0.45 , 0.56 , 0.58 , 0.57 , 0.39 , 0.38,
0.42 , 0.50 , 0.65 , 0.75 , 0.68 , 0.52 , 0.40 , 0.55 , 0.60,
0.41 , 0.35 , 0.50 , 0.46 ,0.48 , 0.47 , 0.44 , 0.57 , 0.54,
0.55 , 0.25 , 0.54 , 0.50 , 0.53 , 0.51 , 0.63 , 0.52 , 0.42,
0.44 , 0.32 ,0.52 , 0.47 , 0.50 , 0.47 , 0.46 , 0.55 , 0.46,
0.42 , 0.48 , 0.53 , 0.49 , 0.53 , 0.50 , 0.44 , 0.40 , 0.59,
0.43 , 0.60 ,0.56 , 0.37 ,0.54 , 0.56 , 0.50 , 0.68 , 0.39,
0.61 , 0.45 , 0.43 , 0.48 , 0.45 , 0.60 , 0.32 , 0.50 , 0.48,
0.62 , 0.40 ,0.46, 0.58 , 0.54 , 0.41 , 0.61 , 0.52 , 0.50,
};
string fighter[]={"Druid" ,"Hunter","Mage", "Shaman", "Paladin", "Warlock", "Warrior", "Rogue", "Priest"};
double getWinRate(string f1,string f2)
{
int r,c;
for(int i=0;i<9;i++)
{
if(fighter[i]==f1)
r=i;
if(fighter[i]==f2)
c=i;
}
// cout<<r<<c<<endl;
return avewin[r][c];
}
int main()
{
int t;
int i,j;
double win[3];
double result;
string fighter1[3];
string fighter2[3];
cin>>t;
while(t--)
{
cin>>fighter1[0]>>fighter1[1]>>fighter1[2];
cin>>fighter2[0]>>fighter2[1]>>fighter2[2];
for(i=0;i<3;i++)
{
win[i]=getWinRate(fighter1[i],fighter2[i]);
//cout<<win[i]<<' ';
}
result=1*(win[0]*(1-win[1])*(1-win[2])+(1-win[0])*win[1]*(1-win[2])+(1-win[0])*(1-win[1])*win[2]);
result+=2*(win[0]*win[1]*(1-win[2])+(1-win[0])*win[1]*win[2]+win[0]*(1-win[1])*win[2]);
result+=3*win[0]*win[1]*win[2];
cout<<fixed<<setprecision(2)<<result<<endl;
}
return 0;
}