P8091 [USACO22JAN] Non-Transitive Dice B 题解
直接模拟就好了(暴力出奇迹)。
因为不知道是 \(A\) 击败 \(B\) 还是 \(B\) 击败 \(A\),所以只要判断 chck 函数的结果是否相等(相等即为「非传递的」)就行了。
然后注意要先排序。
#include<bits/stdc++.h>
using namespace std;
int T, a[5], b[5], c[5];
bool flag = false;
int chck(int m[], int n[]) {
int s1 = 0, s2 = 0;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
if(m[i] > n[j]) s1++;
else if(m[i] < n[j]) s2++;
if(s1 == s2) return -1;
else return s1 > s2 ? 1 : 0;
}
int main() {
scanf("%d", &T);
while(T--) {
flag = false;
for(int i = 1; i <= 4; i++) cin >> a[i];
for(int i = 1; i <= 4; i++) cin >> b[i];
sort(a + 1, a + 5);
sort(b + 1, b + 5);
for(c[1] = 1; c[1] <= 10; c[1]++)
for(c[2] = 1; c[2] <= 10; c[2]++)
for(c[3] = 1; c[3] <= 10; c[3]++)
for(c[4] = 1; c[4] <= 10; c[4]++){
int aa = chck(a, b), bb = chck(c, a), cc = chck(b, c);
if(aa == bb && bb == cc && aa != -1 && bb != -1 && cc != -1) {
flag = true;
break;
}
}
if(flag) printf("yes\n");
else printf("no\n");
}
return 0;
}