2017 Multi-University Training Contest - Team 2 1001 Is Derek lying?



题目链接: 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值