为了消磨牛棚里的时光,奶牛们喜欢玩简单的骰子游戏。
其中一种游戏使用两个骰子 和
进行。
两个骰子均被投掷,获胜的骰子是显示的数字较大的骰子。
如果两者显示相同的数字,则重新投掷(只要持续打平,骰子可能会被重新投掷多次)。
如果骰子 比骰子
赢的概率更大,我们称骰子
击败骰子
。
考虑以下三个的 面骰子:
骰子 在各面上有数字
和
。
骰子 在各面上有数字
和
。
骰子 在各面上有数字
和
。
这些骰子满足一个相当奇妙的性质: 击败
,
击败
,并且
也击败
。
可以看出,三个骰子都不是「最佳的」,因为没有任意一个骰子可以击败其他两个骰子。
在这种情况下,当没有两个骰子打平,也没有一个骰子是最佳的,我们称这三个骰子的集合为「非传递的」。
在非传递的三个骰子的集合中,每个骰子击败一个其他骰子,并输给另一个其他骰子。
给定两个 面骰子
和
各面上的数字,请帮助奶牛们求出是否有方法为第三个骰子
的各面分配数字,使得这个骰子的集合是非传递的。
所有骰子面上的数字必须是 到
的整数。
输入格式
每个测试用例包含多个独立的子测试用例,必须全部回答正确才能通过整个测试用例。
输入的第一行包含 ,为你需要求解的子测试用例的数量。
以下 行,每行描述了一个子测试用例,包含
个整数:骰子
的
面上的整数,以及骰子
的
面上的整数。
所有的数均在 到
之间,不一定排序。
可能同一个数会出现多次,即使在同一个骰子上也可能出现多个相同的数。
输出格式
输出 行。如果有可能为骰子
分配数字使得第
个测试用例成为一个非传递的骰子集合,则第
行输出
,否则输出
。
数据范围,
所有骰子面上的数字均是 到
的整数。
输入样例:
3
4 5 6 7 2 4 5 10
2 2 2 2 1 1 1 1
1 1 1 1 2 2 2 2
输出样例:
yes
no
no
样例解释
第一个子测试用例对应题目中的例子。
在第二个子测试用例中,不存在骰子 可以使得这个骰子集合是非传递的。
同理第三个子测试用例的答案也是 。
using namespace std;
const int N = 10;
int t;
int n = 4;
int a[3][N];
int get(int a[], int b[]){
int r1 = 0, r2 = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(a[i] > b[j]) r1++;
else if(a[i] < b[j]) r2++;
return r1 > r2;
}
bool check(int a[][N]){
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
for(int k = 0; k < 3; k++)
if(i != j && i != k && j != k){
if(get(a[i], a[j]) && get(a[j], a[k]) && get(a[k], a[i]))
return true;
}
return false;
}
int main(){
cin >> t;
while(t--){
for(int i = 0; i < n; i++) cin >> a[0][i];
for(int i = 0; i < n; i++) cin >> a[1][i];
bool flag = false;
for(int i = 1; i <= 10; i++)
for(int j = 1; j <= 10; j++)
for(int k = 1; k <= 10; k++)
for(int l = 1; l <= 10; l++){
a[2][0] = i, a[2][1] = j, a[2][2] = k, a[2][3] = l;
if(check(a)) {
flag = true;
break;
}
}
if(flag) puts("yes");
else puts("no");
}
return 0;
}