麦霸英雄会(递归回溯)

麦霸英雄会

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);

           }

        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值