题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6045
题目大意:
有n 道题每道题有A.B.C三个选项, 每题只有一个正确选项, 答对得一分, 打错不得分, 有两个人A和D都答题, 最终A得x分 D得y分, 并且把每个人的答题答案给你, A的分数是正确的, 问题D是否撒谎。
解题思路:
首先肯定会想到先把A和D相同的答题数记下来sum, 我们可以考虑在这sum个题目中, 从0到sum去枚举 i
答错的个数:
那么对于A来说, 他必须满足的条件是: 当前枚举的错误数+x <= n , sum个题目中对的个数 <= x。
当满足上面两个条件之后, 我们可以知道只有A自己对的题目数, 也就是D必错的题目数。
最后只需要判断当前状态下D的分数是否满足条件就可以了, 如果存在满足的状态, 则说明没有说谎。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MaxN = 1e6;
char A[MaxN + 5], B[MaxN + 5];
int T, x, y, n;
int main(){
scanf("%d", &T);
while(T--){
scanf("%d %d %d", &n, &x, &y);
scanf("%s", A + 1);
scanf("%s", B + 1);
int tot = 0;
bool flag = false;
for(int i = 1; i <= n; i++) if(A[i] == B[i]) tot++;
for(int i = 0; i <= tot; i++){
if(x + i <= n && tot - i <= x){
int a = x - (tot - i);
int b = i + a;
if(y >= tot - i && y <= n - b) flag = true;
}
}
if(flag) printf("Not lying\n");
else printf("Lying\n");
}
return 0;
}