zoukankan      html  css  js  c++  java
  • hgoi#20191105

    T1-joker

    老虎和蒜头是好朋友。
    夏天过去了,凉爽的秋天来临,老虎和蒜头又有了新的娱乐项目。
    老虎有一个远房表亲是西伯利亚虎,那里流行着一个纸牌游戏:两位玩家参与游戏,道具是一副54张的扑克牌,52 张基本牌和两张Joker,也称为王牌。这两张王分别是红色和黑色的。这52 张基本牌又分为黑桃、红桃、梅花、方片四种花色,每种花色均有13 张牌,这13 张牌会有一个等级顺序,依次分别是2 3 4 5 6 7 8 9 10 J Q K A,其中2 是最低的等级,A 是最高的等级。所有的红桃和方片都被认为是红色的,而所有的黑桃和梅花都被认为是黑色的。有一种花色会被硬点,我们称这种花色的牌为庄家牌。
    一局游戏开始前,两名玩家手上都有六张牌,剩余的42 张牌组成牌堆。一局游戏由多轮游戏组成,在每一轮开始前,两名玩家手上均有若干张牌,一名玩家先手,另一名玩家后手。先手的玩家应在桌上放若干张等级相同的牌,注意先手玩家在任意时刻都不允许放置王牌,且放置的牌的张数不能超过后手玩家手上拥有牌的总数。后手玩家可以选择一些自己的牌分别叠在先手玩家的牌上,一张牌可以叠在另一张牌上当且仅当以下条件中至少有一条满足:

    1. 这张牌和被叠的牌花色相同,且有着更高的等级。
    2. 这张牌为庄家牌,而被叠的牌不是。
    3. 这张牌是王牌,且和被叠的牌颜色相同。
    4. 这张牌是王牌,并且它的颜色和为庄家牌的颜色相同。

    在所有桌上的牌都被叠后,先手者还可以在桌面上再放置若干张牌,但这些牌的等级一定要和桌上的任意一张牌的等级相同(无论是否被叠),而后手的玩家仍然可以选择一些自己的牌叠在先手玩家的牌上。注意,先手玩家仍然不能在桌上放置比后手玩家的手牌数更多的牌。
    一轮游戏结束,当且仅当以下两种情况之一发生:后手玩家不能或不想叠桌面上的牌、或是先手玩家不能或不想放置更多的牌。在第一种情况下,当后手玩家认为不必继续这一轮游戏时,先手玩家仍然有一次继续放置非王牌的扑克牌的机会,而放置的牌的等级仍要和桌面上已有的任一张牌等级相同,且桌面上未被叠的牌的总数不能超过后手玩家手上牌的总数。在此之后,后手玩家输掉了这一轮,并将桌面上的所有牌加入自己的手牌。在下一轮游戏中,先手玩家和后手玩家的角色不变。
    在第二种情况下,后手玩家赢得了这一轮。桌面上的所有牌将被移走(并不移入牌堆),而在下一轮中先手和后手玩家的角色将会互换,即先手玩家变为后手玩家,后手玩家变为先手玩家。
    在轮与轮之间,如果上一轮的先手玩家的手牌不超过6 张,他会从牌堆顶部开始一张一张取入手牌,直到手牌恰好有6 张或是牌堆中所有牌均已被取走。
    如果在一轮游戏开始前,一名玩家已经没有手牌,而另一位玩家仍有手牌,那么无手牌的玩家赢得了这一局游戏。如果两位玩家都没有了手牌,那么本局游戏以平局收场。在两名玩家都有至少一张手牌,但先手玩家的手牌只有王牌——他不能做任何行动——的情况下,我们认为后手玩家取得本局游戏的胜利。
    老虎和蒜头正在进行这样的游戏,我们给定牌堆的情况、两人手中的手牌以及特殊牌的花色,你的目标是确定在最优策略下这局游戏的胜者是谁。注意:牌堆的信息对两人来说都是公开的。西伯利亚虎是老虎的朋友,因此蒜头决定每局游戏中让老虎先手。
    老虎认为这个游戏太复杂了,因此在每一局游戏进行前老虎会先从所有牌中去掉某些等级的牌,但老虎保证至少剩下3 个等级的牌,即至少有14 张牌以使得游戏能顺利进行。

    解法

    我知道没人有耐心看完题面
    这道题就是个joke,解题关键在于joker
    先说最优策略,先手每次只出一张最小的牌,后手不出牌
    这样的话,若后手有两张joker,后手输,否则后手胜

    ac代码

    #include<bits/stdc++.h>
    using namespace std;
    int T;
    string st,s1,s2,str1,str2;
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            getchar();
            getline(cin,st);
            getline(cin,s1);
            getline(cin,s2);
            getline(cin,str1);
            getline(cin,str2);
            int l=s2.length(),flg=0;
            for(int i=1;i<l;i++)
                if(s2[i-1]=='R'&&s2[i]=='J')
                    flg++;
                else if(s2[i-1]=='B'&&s2[i]=='J')
                    flg++;
            if(flg==2)puts("laohu");
            else puts("dasuan");
        }
        return 0;
    }
    
  • 相关阅读:
    Java for LeetCode 025 Reverse Nodes in k-Group
    Java for LeetCode 024 Swap Nodes in Pairs
    Java for LeetCode 023 Merge k Sorted Lists
    【JAVA、C++】LeetCode 022 Generate Parentheses
    【JAVA、C++】LeetCode 021 Merge Two Sorted Lists
    【JAVA、C++】LeetCode 020 Valid Parentheses
    【JAVA、C++】LeetCode 019 Remove Nth Node From End of List
    9-[记录操作]--数据的增删改,权限管理
    8-[表操作]--foreign key、表与表的关系
    7-[表操作]--完整性约束
  • 原文地址:https://www.cnblogs.com/muronglin/p/hgoi-20191105.html
Copyright © 2011-2022 走看看