3667 - 夺冠概率

 足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。

假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:
     甲   乙   丙   丁  
甲   -    0.1 0.3 0.5
乙 0.9   -   0.7 0.4
丙 0.7  0.3  -   0.2
丁 0.5  0.6 0.8  -
    数据含义:甲对乙的取胜概率为0.1,丙对乙的胜率为0.3,
    现在要举行一次锦标赛。双方抽签,分两个组比,获胜的两个队再争夺冠军。(参见图)
    请你进行10万次模拟,计算出甲队夺冠的概率。

 

题目输入

题目输出

要求舍掉小数部分只保留到整数部分(注意不是四舍五入)。假如10万次模拟中,有9000次夺冠,应该输出: 9%

输入/输出样例

题目输入


                

题目输出


                

C++解答

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
	int football[3] = {1,3,5};//保存甲对乙  丙  丁的取胜概率
	int semi,final;//分别保存半决赛与决赛甲的对手
	int cnt=0;
	srand(time(0));   //随机数发生器初始化
	for (int i = 0; i < 100000; i++)
	{
		semi=rand()%3;//因为半决赛对阵状况只有3种可能,所以取0~2之间的随机数表示
		if (rand()%10 >= football[semi]) continue;//半决赛甲输	
		else
			switch (semi)
			{
				case 0://半决赛甲乙一组,丙丁一组
					if (rand()%10 >= 2) final = 2;//丁赢
					else final = 1;//丙赢
					break;
				case 1://半决赛甲丙一组,乙丁一组
					if (rand()%10 >= 4) final = 2;//丁赢
					else final = 0;//乙赢
					break;
				default://半决赛甲丁一组,乙丙一组
					if (rand()%10 >= 7) final = 1;//丙赢
					else final = 0;//乙赢
					break;
			}//switch结束
		if (rand()%10 < football[final]) cnt++;//决赛
	}//10万次循环结束
	cout<<int(cnt/1000.0)<<'%';
	return 0;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题