HDU 6045 Is Derek lying (机智)

Description

\(n\)道选择题,每道题有A、B、C三个选项,只有一个正确答案。给出两个人的答案和两个人说自己答对的题数,问有没有一种正确答案的取值使得两个人答对的题目数量与他们所说的一样。

Input

第一行一个整数\(T\)表示用例组数。对于每组用例有三行,第一行三个整数\(n\)\(x\)\(y\),分别表示题目数量和两个人说自己对的题数,第二行和第三行是两个由A、B、C组成的字符串表示两个人的答案。\(1 \leqslant n \leqslant 80000\)

Output

对于每组用例,若有可行方案,输出Not lying,否则输出Lying。

Sample Input

2
3 1 3
AAA
ABC
5 5 0
ABCBC
ACBCB

Sample Output

Not lying
Lying

Solution

统计两个人答案相同的题目数量\(n_1\)和答案不同的题目数量\(n_2\)。对于答案相同的题目,可能是同时对或者同时错;对于答案不同的题目,可能是一对一错,一错一对或者同时错。

分析两个人答对的题目数,不妨设\(x \leqslant y\),有\(y-x\)道题是第二个人比第一个人多做对的,这\(y-x\)道题只能来自两人答案不同的\(n_1\)道题;有\(x\)道题是两人都做对的,这\(x\)道题可能来自与两人答案相同的\(n_1\)道题,两人同时做对,也有可能来自答案不同的\(n_2\)道题,两人分别做对了不同的题。

因此,首先从\(n_2\)道题中取\(y-x\)道令第二个人做对,剩下的题目中最多可以贡献\(n_1+(n_2-y+x)/2\)道使两人都做对,若可以如此分配,说明有可行方案,否则没有可行方案。

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;

char s[N], t[N];

int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        int n, x, y;
        scanf("%d%d%d", &n, &x, &y);
        scanf("%s%s", s, t);
        int diff = 0;
        for (int i = 0; i < n; i++)
            if (s[i] != t[i]) diff++;
        int d = abs(x - y);
        if (diff >= d && n - diff + (diff - d) / 2 >= min(x, y)) printf("Not lying\n");
        else printf("Lying\n");
    }
    return 0;
}

http://acm.hdu.edu.cn/showproblem.php?pid=6045

posted @ 2017-08-06 14:24  达达Mr_X  阅读(241)  评论(0编辑  收藏  举报