2017 多校训练第二场 HDU 6045 Is Derek lying?

来源:互联网 发布:淘宝电脑详情页尺寸 编辑:程序博客网 时间:2024/06/05 09:09

题目链接:点击打开链接

这道题算是一道逻辑判断。

对于两个人的答案,我们可以找出相同的个数和不相同的个数。

那么对于两人相同的答案,要么情况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;}


原创粉丝点击