HDU 1528カードゲームチート(貪欲)

問題の説明

アダムとイブは、52枚のカードの通常のデッキを使用してカードゲームをプレイします。ルールは簡単です。プレイヤーはテーブルの反対側に向かい合って座っています。各プレイヤーはデッキからk枚のカードを受け取り、それらを見た後、カードを裏向きにテーブルに並べます。アダムのカードには左から1からkの番号が付けられ、イブのカードには右から1からkの番号が付けられます(したがって、イブのi:thカードはアダムのi:thカードの反対です)。カードは表向きになり、ポイントは次のように与えられます(i∈{1、。。。、k}ごとに):
アダムのi:thカードがイブのi:thカードに勝った場合、アダムは1ポイントを獲得します。
イブのi:thカードがアダムのi:thカードよりも優れている場合、イブは1ポイントを獲得します。
高い値のカードは常に低い値のカードを打ち負かします。3は2を打ち、4は3と2を打ちます。エースは(おそらく)別のエースを除くすべてのカードを打ちます。
2枚のi:thカードの値が同じ場合、どちらが勝つかを決定します。ハートは他のすべてのスートに勝ち、スペードはハートを除くすべてのスートに勝ち、ダイアモンドはクラブのみに勝ち、クラブはどのスートにも勝ちません。
たとえば、スペードの10は、ダイヤモンドの10を上回りますが、クラブのジャックは上回りません。
これは運が左右するゲームであるはずですが、最近イブがほとんどの場合勝っています。その理由は、彼女がマークされたカードを使い始めたためです。言い換えれば、彼女は、アダムが表向きにする前に、どのカードがテーブルにあるかを知っています。この情報を使用して、彼女は自分のカードを注文して、できるだけ多くのポイントを獲得します。
あなたの仕事は、アダムとイブのカードを考えて、イブが最適にプレーした場合に獲得できるポイント数を決定することです。

入力

いくつかのテストケースがあります。入力の最初の行には、テストケースの数を示す単一の正の整数Nが含まれます。その行の後、テストケースに従います。

各テストケースは、各プレーヤーが取得するカードの数である単一の正の整数k <= 26の行で始まります。次の行は、アダムがテーブルに置いたk枚のカードを左から右に説明しています。次の行は、イブが持っているk枚のカードについて説明しています(ただし、彼女はまだそれらをテーブルに置いていません)。カードは2つの文字で表され、最初の文字はその値(2、3、4、5、6、7、8、9、T、J、Q、K、またはA)であり、2番目の文字はそのスーツです。 (C、D、S、またはH)。カードは空白で区切られます。したがって、アダムのカードがクラブの10枚、ハートの2枚、ダイヤモンドのジャックである場合、それは次の行で説明できます。

TC 2H JD

出力

テストケースごとに、イブがテーブルにカードを配置するための最適な方法を選択した場合に得られるポイント数を含む1行を出力します。

サンプル入力

3
1
JD
JH
2
5D TC
4C 5H
3
2H 3H 4H
2D 3D 4D

サンプル出力

1
1
2

アイデア

入力した数字と文字を数字に変換して、すべてのカードが数字を使用してサイズを示すようにします。両方のプレイヤーのカードを降順に並べます。Aのi番目のカードとBのi番目のカードの比率は、Aが大きく、カウントに1を加えたもの、Bが大きい、Aのi +1番目のカードがBのi番目のカードと比較されます。 Aが大きくなるまで。Aが大きい場合にのみ、このカードを使用してBと比較できます。Aが小さい場合、ここでこのカードを使用すると無駄になります。Bの小さいカードと比較するために保管してください。

コード

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

int k;

void input(int a[])										//数据转换 
{
    
    
	char tmp[2];
		for(int i=1;i<=k;i++)
		{
    
    
			cin>>tmp;
			if(tmp[0]=='T')
				a[i]+=9*4;
			else if(tmp[0]=='J')
				a[i]+=10*4;
			else if(tmp[0]=='Q')
				a[i]+=11*4;
			else if(tmp[0]=='K')
				a[i]+=12*4;
			else if(tmp[0]=='A')
				a[i]+=13*4;
			else
			    a[i]+=int(tmp[0]-'1')*4;
			switch(tmp[1])
			{
    
    
				case 'C':a[i]+=0;break;
				case 'D':a[i]+=1;break;
				case 'S':a[i]+=2;break;
				case 'H':a[i]+=3;break;
			}
		}
}

int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		cin>>k;
		int a[30]={
    
    0},b[30]={
    
    0};
		input(a);
		input(b);
		sort(a+1,a+k+1,greater<int>());					//从大到小排序 
		sort(b+1,b+k+1,greater<int>());
		int cnt=0,j=1;
		for(int i=1;i<=k;i++)
		{
    
    
			if(b[j]>a[i])
			{
    
    
				j++;
				cnt++;
			}
		}
		cout<<cnt<<endl;
	}
}

おすすめ

転載: blog.csdn.net/m0_54621932/article/details/113998153