版权声明: https://blog.csdn.net/King8611/article/details/82312905
题目链接:https://nanti.jisuanke.com/t/30992
这道题其实并不是太难,只是个模拟,只不过读题太难了,真的是醉了,我朋友帮忙翻译了一下,大概意思:
把m张牌(牌上数字范围是1-13)放到栈里
n个人,每个人每次从栈顶取5张牌,轮流取
取完牌后,第1个人出他手里最小的牌,
然后2-n个人轮流出牌,每次出牌的选择是:
(1)出比前一个人的牌大1的牌
(2)在前一个牌不是2的时候可以出2
(优先选择(1)出牌方式出牌)
如果第i个人没有能出的牌,他就“过”
如果第X个人出完牌后,走了一圈到了X,中间没一个人能出牌,那么从X开始所有人要从栈中取一张牌,接着,X出他手里最小的牌。
如果栈里没牌了,那么就跳过取牌的环节
谁先出完牌谁胜,剩下的人输出他的惩罚(惩罚是手里牌的值之和)
然后直接模拟就好了。代码:
import java.io.*;
import java.util.*;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int t=getInt();
for(int p=1;p<=t;p++){
int n=getInt();
int m=getInt();
int arr[][]=new int[n][13];
Queue<Integer> q = new LinkedList<Integer>(); //储存当前栈中拥有得牌得队列
for(int i=0;i<m;i++){
q.offer(getInt()%13); //附加牌,为了方便计算,13取0.
}
for(int i=0;i<5*n;i++){ //第一轮发牌,这里注意,牌可能不够发,栈中没有牌了要及时中断
if(q.isEmpty())
break;
arr[i/5][q.poll()]++;
}
int nowcard=0,nowplayer=0, lastplayer=0; //刚刚出过得牌,当前轮到了谁,上一手牌是谁打出来的
for(int i=3;i<=15;i++){
if(arr[0][i%13]!=0){
nowcard=i%13;
arr[0][i%13]--;
break;
}
}
while(true){
nowplayer=(nowplayer+1)%n;
if(lastplayer==nowplayer){ //如果走了一圈
for(int i=0;i<n;i++){
if(q.isEmpty()) //大家都取一张牌
break;
arr[(nowplayer+i)%n][q.poll()]++;
}
for(int i=3;i<=15;i++){ //这个人打出一张最小
if(arr[nowplayer][i%13]!=0){
nowcard=i%13;
arr[nowplayer][i%13]--;
break;
}
}
}
else if(nowcard!=2){ //否则,如果当前牌不是2
if(arr[nowplayer][(nowcard+1)%13]!=0){ //判断这个玩家是否压住上一张牌
arr[nowplayer][(nowcard+1)%13]--;
lastplayer=nowplayer;
nowcard=(nowcard+1)%13;
}
else if(arr[nowplayer][2]!=0){ //否则看他是不是有2
arr[nowplayer][2]--;
lastplayer=nowplayer;
nowcard=2;
}
}
int sum=0; //看看当前玩家牌是否出完
for(int i=0;i<13;i++){
sum+=arr[nowplayer][i];
}
if(sum==0)
break;
}
System.out.println("Case #"+p+":");
for(int i=0;i<n;i++){
int sum=arr[i][0]*13;
for(int j=1;j<13;j++){
sum+=arr[i][j]*j;
}
System.out.println(sum==0?"Winner":sum);
}
}
}
static int getInt() throws IOException{
in.nextToken();
return (int) in.nval;
}
}