2018 icpc北京网络赛C cheat 模拟

这题就是一个模拟。比赛时候还有三个多小时,当时也没有开别的题,终于等到了模拟。(本弱鸡模拟选手终于有时间写模拟了)。

反正写模拟最主要的就是要自己思路清晰,写之前我自己开了一个txt,吧每个人的游戏策略自己写一遍,然后保持头脑清晰慢慢写就好了。(wa了两发。。第一次是忘记第四个人也是字典序最小了,直接复制了第三个人的数量最少。。第二次是再第三个人找完数量最少判断别人是否质疑的时候把找到的序号加上了,应该加原来的序号。)

题意:一副没有大小王的扑克牌,4个人,每人随机13张,按A,2,3,。。。,J,Q,K的要求顺序(K后面再接着A)按1,2,3,4的顺序轮流出牌。

每次可以出任意张牌。你出的牌不一定全是当前要求的牌。这是其他人可以按顺序选择是否质疑出牌人。质疑成功,出牌人拿回桌子上所有牌,否则质疑的人拿走桌子上所有牌。如果没人质疑,牌就留在桌子上。轮到下一个人出牌。每个人有不同的游戏策略。

贴一下比赛时候记录的策略,这题也就这样了。。。

1 :  出牌 说真话,每次一张,没牌放一张字典序最小 10 2 3 ... A J K Q
      如果下一轮轮到他,而且必须撒谎,质疑
      如果一个人出X 说p张,手里X q张,p+q>4 质疑
2: 出牌 说真话,每次所有,没牌放一张字典序最小 10 2 3 ... A J K Q
      如果下一轮轮到他,而且必须撒谎,质疑
3: 出牌 说真话,每次所有,没牌放牌数量最少,最少中字典序最小 10 2 3 ... A J K Q   
      四张牌都有质疑
4: 当前牌如果3-4张,全出,否则,出所有当前牌+一张字典序最小
      出牌的人出光手牌质疑。

昨天手感真的挺不错的。。从读题到改到ac一共就花了1个小时多一些。。

比赛时比较丑陋的代码

#include
#define rush() int T;scanf("%d",&T);int kase=1;while(T--)
#define all(x) (x).begin(),(x).End()
using namespace std;
typedef long long ll;
const int maxn=2e6+5;
const int mod=1e9+7;
const ll INF=0x3f3f3f3f3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-7;
inline ll read(){ll ans=0,flag=1;char c;c=getchar();while(c<'0' || c>'9'){if(c=='-')flag=-1;c=getchar();}while(c>='0' && c<='9'){ans=ans*10+(ll)(c-'0');c=getchar();}return ans*flag;}
ll quickpow(ll x,ll y,ll mod){ll ans=1;while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans;}

string str[15],s[15];
map mp,mmp;

struct Poker124{
    string name;
    int num;
    Poker124(){}
    Poker124(string name,int num):name(name),num(num){}
    bool operator <(const Poker124& a)const{
        return name p1,p2,p4;
priority_queue p3;

void init()
{
    str[0]="A";
    str[1]="2";
    str[2]="3";
    str[3]="4";
    str[4]="5";
    str[5]="6";
    str[6]="7";
    str[7]="8";
    str[8]="9";
    str[9]="10";
    str[10]="J";
    str[11]="Q";
    str[12]="K";
    for(int i=0;i<=12;i++)
    {
        s[i]=str[i];
        mp[str[i]]=i;
    }
    sort(s,s+13);
    for(int i=0;i<13;i++)
        mmp[s[i]]=i;
}

string have[25];
int num[10][25];
int all[25];

int main()
{
    init();
    while(cin>>have[0])
    {
        memset(num,0,sizeof num);
        memset(all,0,sizeof all);
        num[1][mp[have[0]]]++;
        for(int i=1;i<13;i++)
        {
            cin>>have[i];
            num[1][mp[have[i]]]++;
        }
        for(int i=0;i<13;i++)
        {
            cin>>have[i];
            num[2][mp[have[i]]]++;
        }
        for(int i=0;i<13;i++)
        {
            cin>>have[i];
            num[3][mp[have[i]]]++;
        }
        for(int i=0;i<13;i++)
        {
            cin>>have[i];
            num[4][mp[have[i]]]++;
        }
        int now=1,pos=0;
        int numA=13,numB=13,numC=13,numD=13;
        while(1)
        {
            if(now==1)
            {
                numA--;
                if(num[1][pos])
                {
                    num[1][pos]--;
                    all[pos]++;
                    if(num[2][(pos+1)%13]==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[2][i]+=all[i];
                            numB+=all[i];
                            all[i]=0;
                        }
                    }
                    else if(numA==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[4][i]+=all[i];
                            numD+=all[i];
                            all[i]=0;
                        }
                    }
                }
                else
                {
                    for(int i=0;i<13;i++)
                    {
                        if(num[1][mp[s[i]]])
                        {
                            num[1][mp[s[i]]]--;
                            all[mp[s[i]]]++;
                            break;
                        }
                    }
                    if(num[2][(pos+1)%13]==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[1][i]+=all[i];
                            numA+=all[i];
                            all[i]=0;
                        }
                    }
                    else if(num[3][pos]==4)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[1][i]+=all[i];
                            numA+=all[i];
                            all[i]=0;
                        }
                    }
                    else if(numA==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[1][i]+=all[i];
                            numA+=all[i];
                            all[i]=0;
                        }
                    }
                }
                if(numA==0)
                    break;
            }
            else if(now==2)
            {
                if(num[2][pos])
                {
                    numB-=num[2][pos];
                    all[pos]+=num[2][pos];
                    num[2][pos]=0;
                    if(numB==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[4][i]+=all[i];
                            numD+=all[i];
                            all[i]=0;
                        }
                    }
                }
                else
                {
                    int cnt;
                    for(int i=0;i<13;i++)
                    {
                        if(num[2][mp[s[i]]])
                        {
                            all[mp[s[i]]]++;
                            numB--;
                            cnt=1;
                            num[2][mp[s[i]]]--;
                            break;
                        }
                    }
                    if(num[3][pos]==4)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[2][i]+=all[i];
                            numB+=all[i];
                            all[i]=0;
                        }
                    }
                    else if(numB==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[2][i]+=all[i];
                            numB+=all[i];
                            all[i]=0;
                        }
                    }
                    else if(num[1][pos]+cnt>4)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[2][i]+=all[i];
                            numB+=all[i];
                            all[i]=0;
                        }
                    }
                }
                if(numB==0)
                    break;
            }
            else if(now==3)
            {
                if(num[3][pos])
                {
                    numC-=num[3][pos];
                    all[pos]+=num[3][pos];
                    num[3][pos]=0;
                    if(numC==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[4][i]+=all[i];
                            numD+=all[i];
                            all[i]=0;
                        }
                    }
                }
                else
                {
                    int x=55,y=-1,cnt;
                    for(int i=0;i<13;i++)
                    {
                        if(num[3][i]4)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[3][i]+=all[i];
                            numC+=all[i];
                            all[i]=0;
                        }
                    }
                }
                if(numC==0)
                    break;
            }
            else if(now==4)
            {
                if(num[4][pos]>=3)
                {
                    int cnt=num[4][pos];
                    numD-=cnt;
                    all[pos]+=cnt;
                    num[4][pos]=0;
                    if(num[1][(pos+1)%13]==0)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[1][i]+=all[i];
                            numA+=all[i];
                            all[i]=0;
                        }
                    }
                }
                else
                {
                    int cnt;
                    cnt=num[4][pos];
                    numD-=cnt;
                    all[pos]+=cnt;
                    num[4][pos]=0;
                    bool flag=false;
                    for(int i=0;i<13;i++)
                    {
                        if(num[4][mp[s[i]]])
                        {
                            cnt++;
                            flag=true;
                            num[4][mp[s[i]]]--;
                            numD--;
                            all[mp[s[i]]]++;
                            break;
                        }
                    }
                    if(num[1][(pos+1)%13]==0)
                    {
                        if(flag)
                        {
                            for(int i=0;i<13;i++)
                            {
                                num[4][i]+=all[i];
                                numD+=all[i];
                                all[i]=0;
                            }
                        }
                        else
                        {
                            for(int i=0;i<13;i++)
                            {
                                num[1][i]+=all[i];
                                numA+=all[i];
                                all[i]=0;
                            }
                        }
                    }
                    else if(num[1][pos]+cnt>4)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[4][i]+=all[i];
                            numD+=all[i];
                            all[i]=0;
                        }
                    }
                    else if(num[3][pos]==4)
                    {
                        for(int i=0;i<13;i++)
                        {
                            num[4][i]+=all[i];
                            numD+=all[i];
                            all[i]=0;
                        }
                    }
                }
                if(numD==0)
                    break;
            }
            now++;
            if(now>4)
                now=1;
            pos++;
            pos%=13;
        }
        for(int i=1;i<=4;i++)
        {
            bool flag=false;
            bool ok=false;
            for(int j=0;j<13;j++)
            {
                int tot=num[i][j];
                if(tot)
                {
                    flag=true;
                    for(int k=0;k

赛后略微修改一下的代码

#include
#define rush() int T;scanf("%d",&T);int kase=1;while(T--)
#define all(x) (x).begin(),(x).End()
using namespace std;
typedef long long ll;
const int maxn=2e6+5;
const int mod=1e9+7;
const ll INF=0x3f3f3f3f3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-7;
inline ll read(){ll ans=0,flag=1;char c;c=getchar();while(c<'0' || c>'9'){if(c=='-')flag=-1;c=getchar();}while(c>='0' && c<='9'){ans=ans*10+(ll)(c-'0');c=getchar();}return ans*flag;}
ll quickpow(ll x,ll y,ll mod){ll ans=1;while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans;}

string str[15],s[15];
map mp,mmp;

void init()
{
    str[0]="A";
    str[1]="2";
    str[2]="3";
    str[3]="4";
    str[4]="5";
    str[5]="6";
    str[6]="7";
    str[7]="8";
    str[8]="9";
    str[9]="10";
    str[10]="J";
    str[11]="Q";
    str[12]="K";
    for(int i=0;i<=12;i++)
    {
        s[i]=str[i];
        mp[str[i]]=i;
    }
    sort(s,s+13);
    for(int i=0;i<13;i++)
        mmp[s[i]]=i;
}

string have[25];
int num[10][25];
int all[25];
int ans[5];

void punish(int x)
{
    for(int i=0;i<13;i++)
    {
        num[x][i]+=all[i];
        ans[x]+=all[i];
        all[i]=0;
    }
}

int main()
{
    init();
    while(cin>>have[0])
    {
        memset(num,0,sizeof num);
        memset(all,0,sizeof all);
        num[1][mp[have[0]]]++;
        for(int j=1;j<=4;j++)
        {
            int i;
            if(j==1) i=1;
            else i=0;
            for(;i<13;i++)
            {
                cin>>have[i];
                num[j][mp[have[i]]]++;
            }
        }
        int now=1,pos=0;
        ans[1]=ans[2]=ans[3]=ans[4]=13;
        while(1)
        {
            if(now==1)
            {
                ans[1]--;
                if(num[1][pos])
                {
                    num[1][pos]--;
                    all[pos]++;
                    if(num[2][(pos+1)%13]==0)
                    {
                        punish(2);
                    }
                    else if(ans[1]==0)
                    {
                        punish(4);
                    }
                }
                else
                {
                    for(int i=0;i<13;i++)
                    {
                        if(num[1][mp[s[i]]])
                        {
                            num[1][mp[s[i]]]--;
                            all[mp[s[i]]]++;
                            break;
                        }
                    }
                    if(num[2][(pos+1)%13]==0)
                    {
                        punish(1);
                    }
                    else if(num[3][pos]==4)
                    {
                        punish(1);
                    }
                    else if(ans[1]==0)
                    {
                        punish(1);
                    }
                }
                if(ans[1]==0)
                    break;
            }
            else if(now==2)
            {
                if(num[2][pos])
                {
                    ans[2]-=num[2][pos];
                    all[pos]+=num[2][pos];
                    num[2][pos]=0;
                    if(ans[2]==0)
                    {
                        punish(4);
                    }
                }
                else
                {
                    int cnt;
                    for(int i=0;i<13;i++)
                    {
                        if(num[2][mp[s[i]]])
                        {
                            all[mp[s[i]]]++;
                            ans[2]--;
                            cnt=1;
                            num[2][mp[s[i]]]--;
                            break;
                        }
                    }
                    if(num[3][pos]==4)
                    {
                        punish(2);
                    }
                    else if(ans[2]==0)
                    {
                        punish(2);
                    }
                    else if(num[1][pos]+cnt>4)
                    {
                        punish(2);
                    }
                }
                if(ans[2]==0)
                    break;
            }
            else if(now==3)
            {
                if(num[3][pos])
                {
                    ans[3]-=num[3][pos];
                    all[pos]+=num[3][pos];
                    num[3][pos]=0;
                    if(ans[3]==0)
                    {
                        punish(4);
                    }
                }
                else
                {
                    int x=55,y=-1,cnt;
                    for(int i=0;i<13;i++)
                    {
                        if(num[3][i]4)
                    {
                        punish(3);
                    }
                }
                if(ans[3]==0)
                    break;
            }
            else if(now==4)
            {
                if(num[4][pos]>=3)
                {
                    int cnt=num[4][pos];
                    ans[4]-=cnt;
                    all[pos]+=cnt;
                    num[4][pos]=0;
                    if(num[1][(pos+1)%13]==0)
                    {
                        punish(1);
                    }
                }
                else
                {
                    int cnt;
                    cnt=num[4][pos];
                    ans[4]-=cnt;
                    all[pos]+=cnt;
                    num[4][pos]=0;
                    bool flag=false;
                    for(int i=0;i<13;i++)
                    {
                        if(num[4][mp[s[i]]])
                        {
                            cnt++;
                            flag=true;
                            num[4][mp[s[i]]]--;
                            ans[4]--;
                            all[mp[s[i]]]++;
                            break;
                        }
                    }
                    if(num[1][(pos+1)%13]==0)
                    {
                        if(flag)
                        {
                            punish(4);
                        }
                        else
                        {
                            punish(1);
                        }
                    }
                    else if(num[1][pos]+cnt>4)
                    {
                        punish(4);
                    }
                    else if(num[3][pos]==4)
                    {
                        punish(4);
                    }
                }
                if(ans[4]==0)
                    break;
            }
            now++;
            if(now>4)
                now=1;
            pos++;
            pos%=13;
        }
        for(int i=1;i<=4;i++)
        {
            bool flag=false;
            bool ok=false;
            for(int j=0;j<13;j++)
            {
                int tot=num[i][j];
                if(tot)
                {
                    flag=true;
                    for(int k=0;k

 

你可能感兴趣的:(模拟)