GCPC 总决赛要来了,DarknessCatcher 的学校和 yxlxszx 的学校分别有 n 支队伍,DarknessCatcher 的第 i 支队伍有 ai 个“大跌”,yxlxszx 的第 i 支队伍有 bi 个“大跌”,“大跌”越多的队伍越强,如果“大跌”数量相等则一样强。
现在 DarknessCatcher 和 yxlxszx 的 n 支队伍两两匹配,对于某种两两匹配的情况,对于 1≤i≤n ,如果 DarknessCatcher 第 i 支队伍严格强于 yxlxszx 的第 i 支队伍,那么 DarknessCatcher 得一分,如果 DarknessCatcher 第 iii 支队伍严格弱于 yxlxszx 的第 i 支队伍,那么 yxlxszx 得一分,否则双方均不得分。最后分数高的一方获得这一种比赛局面的胜利,分数低的一方失败,分数相等平局。
请你计算对于所有两两匹配的比赛局面中 DarknessCatcher 获胜的情况数,失败的情况数,平局的情况数。
输入描述:
第一行给定一个正整数 (1≤n≤10) 表示两方的队伍数量。
第二行给定 n 个正整数 (0≤ai≤3) 表示 DarknessCatcher 每支队伍的“大跌”数量。
第三行给定 n 个正整数 0≤bi≤3) 表示 yxlxszx 每支队伍的“大跌”数量。
输出描述:
输出所有情况中 DarknessCatcher 获胜的情况数,失败的情况数,平局的情况数。示例1
输入
2 0 2 1 3输出
0 1 1说明
所有情况为:
(0,3),(2,1) 此时 DarknessCatcher 有一支队伍获胜,yxlxszx 有一支队伍获胜,平局。
(0,1),(2,3) 此时 DarknessCatcher 没有队伍获胜,yxlxszx 有两支队伍获胜,DarknessCatcher 失败。
深度优先搜索,找到每一种情况,想到了但是太长时间没写搜索了,不敢写,一直在搞第一题结果炸了,时间不够了.
#include<iostream>
using namespace std;
int n,y,s,p;
int path[20],s1[20],s2[20];
bool st[20];
void dfs(int u){
if(u==n){
int ans=0;
for(int i=0;i<n;i++){
if(path[i]>s2[i+1]) {
ans += 1;
}
else if(path[i]<s2[i+1]) {
ans -= 1;
}
}
if(ans>0){
y+=1;
}
if(ans==0){
p+=1;
}
if(ans<0){
s+=1;
}
return;
}
for(int i=1;i<=n;i++){
if(!st[i]){
path[u]=s1[i];
st[i]=true;
dfs(u+1);
st[i]= false;
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&s1[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&s2[i]);
}
dfs(0);
printf("%d %d %d",y,s,p);
return 0;
}