这题就是一个模拟。比赛时候还有三个多小时,当时也没有开别的题,终于等到了模拟。(本弱鸡模拟选手终于有时间写模拟了)。
反正写模拟最主要的就是要自己思路清晰,写之前我自己开了一个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