真就是个模拟,没啥要优化的,打细心点就能过,,注意读题。
比如说就算只有一个人,也要把这轮游戏走完才能break啊之类的要仔细审题。
注意细节。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
int in{
int cnt=0,f=1;char ch=0;
while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-')f=-1;}
while(ch>='0'&&ch<='9')cnt=cnt*10+ch-48,ch=getchar();
return cnt*f;
}
int n,m,l,s,T;
//n个人,面额m,每个人l张,s表示J,T表示轮数上限。
queue<int> q[103];
deque<int>::iterator IT;
stack<int> Q;
int b[10003],bcnt;
int a[103][103];
int num[10003];
int cntempty;
int tem[10003],temcnt;
int ans[10003];
//void debug(){
// cout<<endl;
// cout<<"#";
// temcnt=0;while(!Q.empty()){
// tem[++temcnt]=Q.top();Q.pop();
// }
// for(int i=temcnt;i>=1;i--)cout<<tem[i]<<" ";cout<<endl;
// for(int i=temcnt;i>=1;i--)Q.push(tem[i]);
// cout<<"#";for(int i=1;i<=bcnt;i++)cout<<num[i]<<" ";cout<<endl;
// cout<<endl;
//}
signed main(){
// freopen("fishing.in","r",stdin);
// freopen("fishing.out","w",stdout);
while(1){
memset(num,0,sizeof(num));
n=in;m=in;l=in;s=in;T=in;if(n==-1)return 0;
// cout<<"####"<<n<<" "<<m<<" "<<l<<" "<<s<<" "<<T<<endl;
bcnt=0;
while(!Q.empty())Q.pop();
for(int i=1;i<=n;i++){
ans[i]=0;while(!q[i].empty())q[i].pop();
for(int j=1;j<=l;j++){
b[++bcnt]=a[i][j]=in;
}
}b[++bcnt]=s;cntempty=0;
sort(b+1,b+bcnt+1);bcnt=unique(b+1,b+bcnt+1)-b-1;
s=lower_bound(b+1,b+bcnt+1,s)-b;
for(int i=1;i<=n;i++){
for(int j=1;j<=l;j++){
a[i][j]=lower_bound(b+1,b+bcnt+1,a[i][j])-b;
q[i].push(a[i][j]);
}
}
for(int o=1;o<=T;o++){//cout<<endl<<"# "<<o<<" "<<n<<endl;
for(int i=1;i<=n;i++){//cout<<i<<" ";
if(q[i].empty())continue;
int x=q[i].front();q[i].pop();
//num[x]=1;
if(x==s&&!Q.empty()){
temcnt=0;Q.push(x);
while(!Q.empty()){
tem[++temcnt]=Q.top();num[Q.top()]=0;Q.pop();
}
for(int j=temcnt;j>=1;j--)q[i].push(tem[j]);
}
else if(num[x]){
temcnt=0;tem[++temcnt]=x;
while(Q.top()!=x){
tem[++temcnt]=Q.top();num[Q.top()]=0;Q.pop();
}tem[++temcnt]=Q.top();num[Q.top()]=0;Q.pop();
num[x]=0;for(int j=temcnt;j>=1;j--)q[i].push(tem[j]);
}else{
Q.push(x);num[x]=1;
}
if(q[i].empty()){
++cntempty;ans[i]=-o;
// if(cntempty==n-1)break;
}
// debug();
//cout<<i<<" ";
}if(cntempty>=n-1)break;//cout<<endl;
}//cout<<"#";
for(int i=1;i<=n;i++){
if(ans[i]<0)printf("%d ",ans[i]);
else printf("%d ",q[i].size());
}printf("\n");
for(int i=1;i<=n;i++){
if(!q[i].empty()){temcnt=0;
while(!q[i].empty()){
tem[++temcnt]=q[i].front();q[i].pop();
}for(int j=1;j<=temcnt;j++)printf("%d ",b[tem[j]]);
}printf("\n");
}
}
return 0;
}