链接:登录—专业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);
}
}
新人第一次写文章,刚学编程不久,如有不足欢迎各位大佬指出