本文主要是介绍1003 Hit or Miss,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
又是个坑了我2小时WA到吐的大水题,狗血题目就看了我半天!真是无力吐槽那坑爹的英文题目的描述了。
1.开始以为是几个玩家同步报数匹配,其实是轮流报数匹配,即:A->B->C->D->A->B->C->D->A->B.......
2. 大致流程是:A做一次报数,如果没有match,放回A自己的底部。如果match了,放到B的底部。A做完一次报数后,轮到B报数(注意只有当B有牌时才报数),如果没有match,放回B自己的底部。如果match了,放到C的底部; 再到C报数。。。。依次循环下去
3.维护几个queue即可。
#include <iostream>
#include<queue>
#include<cstring>
using namespace std;queue<int>que[11];
int callnum[11];
int fina[11];
int T,player,num,ter;int main()
{cin>>T;int yy=1;while(T--){bool flag=false;cin>>player;fill(que,que+player,queue<int>());memset(callnum,0,sizeof(callnum));memset(fina,0,sizeof(fina));for (int i=0;i<52;i++){cin>>num;que[0].push(num);}int c=0;int aa=0;for (;;){c++;if(c>100000) {flag=true; break;}//terminated situationter=0;for (int i=0;i<player;i++){if(que[i].empty())ter++;}if(ter==player) break;aa=aa%player;if(!que[aa].empty()){ callnum[aa]=callnum[aa]%13;callnum[aa]=callnum[aa]+1;int temp=que[aa].front();que[aa].pop();if (temp==callnum[aa]){if (que[aa].size()==0){fina[aa]=temp;}que[aa+1].push(temp);}elseque[aa].push(temp);}aa++;}if(flag==true) cout<<"Case "<<yy++<<": unwinnable"<<endl;else{cout<<"Case "<<yy++<<": ";for (int i=0;i<player-1;i++){cout<<fina[i]<<" ";}cout<<fina[player-1]<<endl;}}return 0;
}
这篇关于1003 Hit or Miss的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!