Is Derek lying?
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1197 Accepted Submission(s): 648
For each test case,there will be three lines.
The first line consists of three integers N,X,Y,the meaning is mentioned above.
The second line consists of N characters,each character is “A” “B” or “C”,which represents the answer of Derek for each question.
The third line consists of N characters,the same form as the second line,which represents the answer of Alfia for each question.
Data Range:1≤N≤80000,0≤X,Y≤N,∑Ti=1N≤300000
Please print “ Lying” if you can make sure that Derek is lying,otherwise please print “Not lying”.
首先,我们统计出Derek和Alfia答案相同的题目数量k1和答案不同的题目数量k2.
对于两人答案相同的题目,共有以下两种情况:
a.两人都对
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在说谎。
/* 题意:给出n个问题,两个人的得分及其对于每道题的选择(答对一题得一分,答错不得分). 问Derek是否有可能说谎? 思路:sum记录答案相同的数目。 两种情况是说谎的: 1.二者的得分差距大于n-sum; 2.二者的得分和减去sum大于问题的总数n。 */ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; typedef long long LL; const int N = 80000 + 100; char d[N], a[N]; int main() { int T; scanf("%d", &T); while(T--) { int n, x, y; scanf("%d%d%d", &n, &x, &y); scanf("%s%s", d, a); int sum = 0; for(int i = 0; i < n; i++) { if(d[i] == a[i]) sum++; } if(abs(x - y) > n - sum || (x + y - sum) > n) printf("Lying\n"); else printf("Not lying\n"); } return 0; }