ACM-ICPC 2018 南京赛区网络预赛 :C. GDY

版权声明: 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;
    }
}

猜你喜欢

转载自blog.csdn.net/King8611/article/details/82312905
今日推荐