首先,我们统计出Derek和Alfia答案相同的题目数量k1和答案不同的题目数量k2. 对于两人答案相同的题目,共有以下两种情况:
两人都对
b.两人都错 对于两人答案不同的题目,共有以下三种情况: c.Derek对Alfia错 d.Alfia对Derek错 e.两人都错 于是我们可以列出一些方程: k1+k2=n a+b=k1 c+d+e=k2 a+c=x a+d=y 又a,b,c,d,e均为非负整数,且满足a,b<=k1;c,d,e<=k2 将a,b,d,e全部用c替换后需要同时满足以下四个条件: 0<=c<=k2 x-y<=c<=k2+x-y (x-y)/2<=c<=(k2+x-y)/2 x-k1<=c<=x 我们只需要判断这四段区间存不存在公共的整数点,如果存在,则说明Derek没有说谎;如果不存在,则说明Derek在说谎。
#include <cstdio>
#include <cmath>
const int N=80005;
int main(){
int t;
int n,x,y;
char D[N],A[N];
scanf("%d",&t);
while(t--){
int cnt=0;
scanf("%d%d%d ",&n,&x,&y);
gets(D);
gets(A);
for(int i=0;i<n;i++){
if(D[i]!=A[i]) cnt++;
}
if(fabs(x-y)>cnt || (x+y)>(2*n-cnt)) printf("Lying\n");
else printf("Not lying\n");
}
return 0;
}