【数据结构】map

1>正确答案

一次考试,n个人m道题,

给你全对的人数和全错的人数

求出字典序最小的答案序列,没有就输出-1

我的思路:分类讨论

每一种考卷的计数,看他和他的相反卷子分别等于p和q的可能

如果p||q,则要么在这些卷子中有正确答案,要么没有解

p==q==0,则找一个没有出现过的答案序列就好

正解是字母树,60行->90行

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
int n,m,p,q;
const int N=30003,M=503;
string s[N];
map <string ,int > mp;
string fz(string a)
{
    for(int i=0;i<m;i++)
        if(a[i]=='Y') a[i]='N';
        else a[i]='Y';
    return a;
}
void print(string ans)
{
    cout<<ans;
    exit(0);
}
string ck;
void dfs(int pos)
{
    if(pos==m)
    {
        if(mp[ck]==0 && mp[(fz(ck))]==0) print(ck);
        return ; 
    }
    
    ck[pos]='N';
    dfs(pos+1);
    ck[pos]='Y';
    dfs(pos+1);
}
int sum;
int main()
{
    cin>>n>>m>>p>>q;
    for(int i=1;i<=n;i++)
        cin>>s[i],mp[s[i]]++;
    sort(s+1,s+n+1);
    n=unique(s+1,s+n+1)-s-1;
    
    if(p || q)
    {
        for(int i=1;i<=n;i++)
        {
            int cnt=mp[s[i]];
            if(cnt==p && mp[fz(s[i])]==q) s[sum++]=s[i];
            else if(cnt==q && mp[fz(s[i])]==p) s[sum++]=fz(s[i]); 
        }
        if(sum)
            sort(s,s+sum),print(s[0]);
        else cout<<"-1"<<endl;
    }
    else
    {
        ck=s[1];
        dfs(0);
        cout<<"-1"<<endl;
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xwww666666/p/11427921.html