题目
题意:给定两个四面筛子A,B,每个面上的数字取值为1到10。问是否存在另一个筛子C,使得A>B,B>C,C>A或B>A,A>C,C>B。筛子X>筛子Y,当且仅当投掷筛子X,得到的数字比筛子Y大,的概率更大。
思路:暴力,枚举所有的筛子,看是否有满足的。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 110;
#define ll long long
const int num = 4;
int a[num], b[num], c[num];
int res;
int beat(int a[], int b[]) {
int x = 0, y = 0;
for (int i = 0; i < num; ++i) {
for (int j = 0; j < num; ++j) {
if (a[i] > b[j]) ++x;
else if (a[i] < b[j]) ++y;
}
}
if (x == y) {
return 0;
}
return x > y ? 1 : -1;
}
void print(int a[]) {
for (int i = 0; i < num; ++i) {
printf("%d ", a[i]);
}
printf("--\n");
}
bool dfs(int deep) {
if (deep == 4) {
bool flag = false;
if (res == 1) {
flag = (beat(c, a) == 1) && (beat(b, c) == 1);
} else {
flag = (beat(c, b) == 1) && (beat(a, c) == 1);
}
// if (flag) {
// print(c);
// }
return flag;
}
for (int i = 1; i<= 10; ++i) {
c[deep] = i;
if (dfs(deep+1)) {
return true;
}
}
return false;
}
void solve() {
for (int i = 0; i < num; ++i) {
scanf("%d", &a[i]);
}
for (int i = 0; i < num; ++i) {
scanf("%d", &b[i]);
}
res = beat(a, b);
// printf("res %d\n", res);
if (!res) {
printf("no\n");
return;
}
bool flag = dfs(0);
printf("%s\n", flag ? "yes" : "no");
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
solve();
}
}