zoukankan      html  css  js  c++  java
  • 【刷题】正确答案

    一次考试,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;
    }
  • 相关阅读:
    PS软件之,快速的修改图片你的尺寸
    想的太多,做的太少
    Java-Junit 的Hello world
    Java-hibernate的映射文件
    工作思路
    Spring入门Hello World
    PHP 进制问题
    Java-hibernate的Hello World
    PHP获得header头进行分析
    动软模板使用教程
  • 原文地址:https://www.cnblogs.com/xwww666666/p/11427921.html
Copyright © 2011-2022 走看看