import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n+1];
int[] b = new int[n+1];
int[] pa = new int[n+1];
for (int i = 1;i <= n;++i) a[i]=in.nextInt();
for (int i = 1;i <= n;++i) b[i]=in.nextInt();
boolean[] visa = new boolean[n+1];
int[] ans = {0,0,0};
dfs(n, 1, pa, visa, ans, a, b);
System.out.println(ans[0]+" "+ans[1]+" "+ans[2]);
}
static void dfs(int n, int i, int[] pa, boolean[] visa, int[] ans,int[] a,int[] b) {
if (i == n+1) {
int awin = 0;
int bwin = 0;
for (int j = 1;j <= n;++j) {
if (a[pa[j]] > b[j]) awin++;
else if (a[pa[j]] < b[j]) bwin++;
}
if (awin > bwin) ans[0]++;
else if (awin < bwin) ans[1]++;
else ans[2]++;
return;
}
for (int k = 1; k <= n; ++k) {
if (visa[k]) continue;
visa[k] = true;
pa[i] = k;
dfs(n, i+1, pa, visa, ans, a, b);
visa[k] = false;
}
}
}
这里我使用了DFS求a队的排列,然后就可以枚举出所有的情况了。
一开始我把b队的排列也求了,后面发现求两个排列没有用,只要枚举其中一队的排列,就可以枚举出所有情况了。

京公网安备 11010502036488号