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