ZOJ4034麻雀第15回浙江省大会のK質問の並べ替え

麻雀仕分け

時間制限: 1秒      メモリ制限: 65536 KB

DreamGridが麻雀のセットを見つけました 彼のポケットに適したタイルとホワイトドラゴンタイル。適した各タイルには、スーツ(キャラクター、竹、またはドット)とランク(1からの範囲)があります。)、各ランクとスーツの組み合わせのタイルは1つだけです。

ランクが1から9のキャラクタータイル

ランクが1から9の範囲の竹タイル

ランクが1から9の範囲のドットタイル

ホワイトドラゴンタイル

DreamGridが退屈しているので、彼はこれらのタイルで遊ぶことにしました。彼は最初に 「ラッキータイル」として適したタイル、そして彼は選ぶ のセットからのタイル これらを並べて並べ替えます 次のルールのタイル:

  • 「ラッキータイル」に含まれている場合 タイルは、左端の位置に配置する必要があります。

  • 2つのタイルの場合 そして どちらも「ラッキータイル」ではないように

    • キャラクタータイルであり、 竹タイル、または

    • キャラクタータイルであり、 ドットタイル、または

    • 竹タイルであり、 ドットタイル、または

    • そして 同じスーツとランクを持っている のランクよりも小さい

    その後 の左側に配置する必要があります

ホワイトドラゴンタイルは特別なタイルです。に含まれている場合タイルの場合、並べ替え中にラッキータイルの元の(ラッキーではない)バージョンと見なされます。たとえば、次の並べ替えられたタイルについて考えてみます。ここでは、「3文字」がラッキータイルとして選択されています。この場合、ホワイトドラゴンタイルは「3キャラクター」のオリジナルの不運なバージョンと見なされ、「2キャラクター」と「4キャラクター」の間に配置する必要があります。

DreamGridはかなり忘れているので、並べ替えた後、ラッキータイルが何であるかをすぐに忘れてしまいます。与えられた 並べ替えられたタイル、DreamGridに可能なラッキータイルの数を教えてください。

入力

複数のテストケースがあります。入力の最初の行には整数が含まれています、テストケースの数を示します。各テストケースについて:

最初の行には2つの整数が含まれています そして (()、ソートされたタイルの数と適切なタイルの最大ランクを示します。

次のために 線、 -行目は -左から右に数えて、並べ替えられたタイル。行は大文字で始まります (()、のスーツを示します -番目のタイル:

  • 場合 、次に整数 (()が続き、ランク付きのキャラクタータイルであることを示します ;

  • 場合 、次に整数 (()が続き、ランク付きの竹タイルであることを示します ;

  • 場合 、次に整数 (()が続き、ランク付きのドットタイルであることを示します ;

  • 場合 、それからそれは白いDrangonタイルです。

幸運なタイルが少なくとも1つ存在することが保証されており、 すべてのテストケースでを超えない

出力

テストケースごとに、1つの整数を含む1行を出力し、可能なラッキータイルの数を示します。

サンプル入力

4 
3 9 
C 2 
W 
C 4 
6 9 
C 2 
C 7 
W 
B 3 
B 4 
D 2 
3100 
C 2 
W 
C 9 
3 9 
C 1 
B 2 
D 3

サンプル出力

2 
4 
7 
25

ヒント

最初のサンプルでは、​​「2文字」と「3文字」がラッキータイルの可能性があります。

2番目のサンプルでは、​​「8文字」、「9文字」、「1竹」、「2竹」がラッキータイルの可能性があります。



トピックの意味はBaiduです。可能性をランク付けしましょう。

1.1。Wはありますか    

2.2。Wの前にゼロ、1、2  

3.3。Wの後ろにありますか

c1 w c3 //最初のものを含める

c1 c2 w c4 //最初のものは含まれません

c1 w //すべて

c2 w //先行するc2は含まれません

c1 c2 w //上記より2つ少ない

w //すべて

c1 //すべて

w c2 // c2の最初の場所

c1 b1 d1 // 3m-n + 1


#include <bits / stdc ++。h>
using namespace std;
int main()
{     int n、shu;     long long int a、b;     int i、j、k、f;     long long int s = 0;     vector <int> ss;     チャーパイ;     scanf( "%d"、&n);     while(n-)    {         j = 0; f = 0; k = 0; ss.clear();         scanf( "%d%d"、&a、&b);         getchar();         for(i = 0; i <a; i ++)        {             s = 0;             scanf( "%c"、&pai);             getchar();             if(pai == 'B')s = b;             else if(pai == 'D')s = b + b;             else if(pai == 'W'






















                 if(ss.size()== 1){s = ss [ss.size()-1]; ss.push_back(s);}
                 else if(ss.size()== 0){ss.push_back( 1); }
                 else if(ss.size()> 1){s = ss [ss.size()-1] +1; ss.push_back(s);}
                続行;
            }
            scanf( "%d"、&shu);
            getchar();
            s = s + shu;
            ss.push_back(s);
        }
        for(i = 0; i <ss.size()-1; i ++)
        {             if(ss [i]> ss [i + 1]){printf( "1 \ n"); k = 1; break; }         }         if(k == 1)continue;         if(f == 1)        {             if(ss.size()== 1)printf( "%d \ n"、3 * b);






            else if(j == a-1 && ss.size()== 2)printf( "%d \ n"、(3 * b)-ss [j] +1);
            else if(j == a-1)printf( "%d \ n"、(3 * b)-ss [j]);
            else printf( "%d \ n"、ss [j + 1] -ss [j]);
        }
        if(f == 0)
        {             printf( "%d \ n"、3 * b-ss.size()+ 1);         }     }     }






おすすめ

転載: blog.csdn.net/paycho/article/details/80186521