牛客小白月赛63->GCPC总决赛,递归方法求解

本文介绍了一位编程初学者如何使用递归方法解决牛客网竞赛中的一个问题。题目涉及两组队伍的匹配,根据队伍的“大跌”数量判断胜负。作者通过递归函数实现固定一个队伍的“大跌”数量,寻找所有可能的匹配,计算获胜、失败和平局的情况。虽然没有使用深度优先搜索,但通过递归成功解决了问题。
摘要由CSDN通过智能技术生成

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

GCPC 总决赛要来了,DarknessCatcher 的学校和 yxlxszx 的学校分别有 nnn 支队伍,DarknessCatcher 的第 iii 支队伍有 aia_iai​ 个“大跌”,yxlxszx 的第 iii 支队伍有 bib_ibi​ 个“大跌”,“大跌”越多的队伍越强,如果“大跌”数量相等则一样强。

现在 DarknessCatcher 和 yxlxszx 的 nnn 支队伍两两匹配,对于某种两两匹配的情况,对于 1≤i≤n1 \le i \le n1≤i≤n ,如果 DarknessCatcher 第 iii 支队伍严格强于 yxlxszx 的第 iii 支队伍,那么 DarknessCatcher 得一分,如果 DarknessCatcher 第 iii 支队伍严格弱于 yxlxszx 的第 iii 支队伍,那么 yxlxszx 得一分,否则双方均不得分。最后分数高的一方获得这一种比赛局面的胜利,分数低的一方失败,分数相等平局。

请你计算对于所有两两匹配的比赛局面中 DarknessCatcher 获胜的情况数,失败的情况数,平局的情况数。

输入描述:

 
 

第一行给定一个正整数 nnn (1≤n≤10)(1 \le n \le 10)(1≤n≤10) 表示两方的队伍数量。

第二行给定 nnn 个正整数 aia_iai​ (0≤ai≤3)(0 \le a_i \le 3)(0≤ai​≤3) 表示 DarknessCatcher 每支队伍的“大跌”数量。

第三行给定 nnn 个正整数 bib_ibi​ (0≤bi≤3)(0 \le b_i \le 3)(0≤bi​≤3) 表示 yxlxszx 每支队伍的“大跌”数量。

输出描述:

输出所有情况中 DarknessCatcher 获胜的情况数,失败的情况数,平局的情况数。

示例1

输入

2
0 2
1 3

输出

0 1 1

说明

所有情况为:

(0,3),(2,1)(0, 3),(2,1)(0,3),(2,1) 此时 DarknessCatcher 有一支队伍获胜,yxlxszx 有一支队伍获胜,平局。

(0,1),(2,3)(0, 1),(2,3)(0,1),(2,3) 此时 DarknessCatcher 没有队伍获胜,yxlxszx 有两支队伍获胜,DarknessCatcher 失败。

牛客竞赛的一道题,大家应该都是用 深度优先搜索解题目。可惜本人是个小白,做这题时还没学到DFS,也不懂图论知识。于是便使用递归的方法求解。

大概的思路就是把a固定,递归找出每个a[i]所对应的b的下标,用辅助数组c来记录

#include <iostream>
using namespace std;

void Combination(int k);

int a[15],b[15],c[15];//c[i]表示a中第i个数对应b的第几个数
int aaa=0,bbb=0,ccc=0;//胜,负,平
int n;
int main()
{
    cin >> n;
    int i;
    for(i=0;i<n;i++)
            cin >> a[i];
    for(i=0;i<n;i++)
            cin >> b[i];
    Combination(0);
    cout <<aaa<<" "<<bbb<<" "<<ccc;
    return 0;
}
void Combination(int k)
{
    int i,j;
    if (k==(n-1))
    {
        int x1=0,x2=0;
        for(i=0;i<n;i++)//最后一个数还没有配对,这里给最后一个数找出他对应的数
        {
            c[k]=i;
            for(j=0;j<k;j++)
            {
                if(c[k]==c[j])//位置冲突
                 break;
            }
            if(j==k)
                break;//因为最后一个数是唯一对应的,找到了就可以退出了
        }
        for(i=0;i<n;i++)//记录比分情况
        {
            if (a[i]>b[c[i]])  x1++;
            else if (a[i]<b[c[i]]) x2++;
        }
        if(x1>x2) aaa++;
        else if (x1<x2) bbb++;
        else ccc++;
        return;
    }

    for(i=0;i<n;i++)//逐个尝试a中第k个数的配对方式
    {
        c[k]=i;
        for(j=0;j<k;j++)//和前面k-1个数比较,看位置是否冲突
        {
            if(c[k]==c[j])//位置冲突
               break;
        }
        if(j==k)//和所有位置都不冲突
            Combination(k+1);
    }
}

新人第一次写文章,刚学编程不久,如有不足欢迎各位大佬指出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值