JZOJ 3888. 正确答案【模拟】


题目:

传送门


题意:

给出 n n n个答案,已知其中有 p p p个是全对的, q q q个是全错的,其他的既不是全对也不是全错
问标准答案是什么,输出字典序较小的那一个


分析:

我们用枚举标准答案是多少来求解,用 m a p map map或哈希来判断全对和全错时的正确答案是不是这一个,若是,则当前答案就是我们的结果
有一种特殊情况就是 p = = 0 p==0 p==0同时 q = = 0 q==0 q==0,这个时候我们发现我们不能通过普通的枚举来确定最终答案,所以我们用 d f s dfs dfs结合 m a p map map来寻找答案


代码:

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#define LL long long
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
map<string,int> m1,m2;
string s[30005],z;
int n=read(),m=read(),p=read(),q=read(),tf=0;
void dfs(int k,string zz)
{
	if(tf) return;
	if(k>m)
	{
		if(m2[zz]!=q) return; 
		for(int i=1;i<=n;i++) if(s[i]==zz) return;
		cout<<zz;tf=1;
		return;
	}
	dfs(k+1,zz+'N');
	dfs(k+1,zz+'Y');
	return;
}
int main()
{
	for(int i=1;i<=n;i++)
	{
		cin>>z;s[i]=z;
		m1[z]++;
		for(int j=0;j<m;j++) z[j]=(z[j]=='Y'?'N':'Y');
		m2[z]++;
	}
	if(!p&&!q) {dfs(1,"");return 0;}
	sort(s+1,s+1+n);
	if(!p)
	  for(int i=1;i<=n;i++)
	  	for(int j=0;j<m;j++) s[i][j]=(s[i][j]=='Y'?'N':'Y');
	for(int i=1;i<=n;i++) 
	  if(m1[s[i]]==p&&m2[s[i]]==q) {cout<<s[i];return 0;}
	printf("-1");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值