麦霸英雄会
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 109 Solved: 38
[Submit][Status][Web Board]
Description
五一长假,落木回家休息了几天,碰巧看到浙江卫视正在热播一个节目《麦霸英雄汇》。它是由两个赛区(比如杭州和广州赛区)的50名麦霸组成的队伍之间的pk赛。每个赛区有一名领队,领队都非常清楚自己队员的实力。期中有一个环节则是由领队随机选出5名麦霸,然后两个赛区的5名麦霸之间进行一一pk,哪个赛区胜多则哪个赛区赢得该环节。当然领队都不是吃素的,他们会选出50名中实力最强的5名麦霸出来,而且这5名的出赛顺序也是由领队定的,但是他们不知道对方麦霸的实力。我们则将比赛简化一点,假设每个赛区只有10名麦霸,现在杭州赛区的领队很想知道他们胜的概率是多大?概率=杭州麦霸赢的pk数/总的pk数。当然也有可能平局,平局的话两边都不算赢,也不算入pk总数。
Input
第一行是case数T(1<=T<=100)
接下来有T组case,每组case有两行
第一行有10个整数,代表杭州赛区10名麦霸的实力ai(0<=ai<=100, 1<=i<=10)
第二行有10个整数,代表广州赛区10名麦霸的实力bi(0<=bi<=100, 1<=i<=10)
Output
输出一行,杭州赛区赢的概率g(以百分制),结果保留两位小数。
Sample Input
2
10 20 30 40 50 60 70 80 90 100
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
Sample Output
100.00
50.00
# include <iostream>
# include <cstdlib>
# include <cstring>
# include <cstdio>
using
namespace
std;
int
cmp(
const
void
*a,
const
void
*b)
{
return
*(
int
*)a < *(
int
*)b ? 1 : -1;
}
const
int
MAX = 15;
int
sum = 0;
//总共pk得数目
int
s = 0;
//pk赢得数目
int
a[MAX] = {0};
//杭州赛区
int
b[MAX] = {0};
//广州赛区
int
c[MAX] = {0};
//临时数组
int
d[MAX] = {0};
//存放五个
int
v[MAX] = {0};
//标记
void
func(
int
flag)
{
for
(
int
i = 0; i < 5; i++)
{
if
(v[i] == 0 )
{
v[i] = 1;
c[flag++] = d[i];
if
(flag == 5)
{
int
x = 0, y = 5;
for
(
int
j = 0; j < 5; j ++)
{
if
(c[j] > b[j])
{
x++;
}
else
if
( c[j] == b[j])
{
y--;
}
}
if
(x > y - x)
{
s++;
sum++;
}
else
if
(x < y - x)
{
sum++;
}
}
else
{
func(flag);
}
flag--;
v[i] = 0;
}
}
}
int
main(
int
argc,
char
*argv[])
{
int
T;
while
(cin >> T)
{
while
(T--)
{
sum = s = 0;
memset
(v, 0,
sizeof
(v));
for
(
int
i = 0; i < 10; i++)
{
cin >> a[i];
}
for
(
int
i = 0; i < 10; i++)
{
cin >> b[i];
}
qsort
(a, 10,
sizeof
(a[0]), cmp);
qsort
(b, 10,
sizeof
(b[0]), cmp);
for
(
int
i = 0; i < 5; i++)
{
d[i] = a[i];
}
func(0);
s = s*100;
if
(s == 0 || sum == 0)
{
cout <<
"0.00"
<< endl;
}
else
{
printf
(
"%.2lf\n"
, (
double
)s / (
double
)sum);
}
}
}
}