JZOJ 3888. 正确答案【模拟】


题目:

传送门


题意:

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


分析:

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


代码:

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章