题目链接:点击打开链接
这道题算是一道逻辑判断。
对于两个人的答案,我们可以找出相同的个数和不相同的个数。
那么对于两人相同的答案,要么情况a:两人都对,要么情况b:两人都错
对于两人不同的答案,要么情况c:A对B错,要么情况d:A错B对,要么情况e:两人都错。
根据以上情况,我们可以列出等式:
a+b=same
c+d+e=diff
a+c=x
a+d=y
又因为a和b都是小于same,c和d和e都是小于diff的。
当a,b,d,e都用c表示后,可以发现四个不等式:
1 0<=c<=diff
2 x-same<=c<=x
3 x-y<=c<=diff+x-y
4 (x-y)/2<=c<=(diff-y+x)/2
只要有c满足上述四个等式,就可以认为没有撒谎Not lying!
遇到题目还是要冷静,把思维整理好之后才能取得胜利!
#include <bits/stdc++.h>
using namespace std;
// #define test TEST
const int maxn=80005;
char a[maxn],b[maxn];
int main(int argc, char const *argv[])
{
#ifdef test
freopen("test.txt","r",stdin);
#endif
int x,y,n,T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&x,&y);
scanf("%s %s",a,b);
int diff=0;
for(int i=0;i<n;i++){
if(a[i]!=b[i]) diff++;
}
int same=n-diff;
int flag=0;
for(int i=0;i<=diff;i++){
if(i>=(x-same)&&i<=x){
if(i>=(x-y)&&i<=(diff+x-y)){
if(i>=(x-y)/2&&i<=(diff-y+x)/2){
flag=1;
}
}
}
if(flag) break;
}
if(flag){
printf("Not lying\n");
}
else{
printf("Lying\n");
}
}
return 0;
}