3667 - 夺冠概率
时间限制 : 1 秒
内存限制 : 128 MB
足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。
假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:
甲 乙 丙 丁
甲 - 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; }