ブラックジャック


リンクテキスト

もんだいぶんせき


カジノで最も人気のあるゲームブラックジャックのルールはかなり簡単です.カードと21を超えない限度内で、カード和を最大限に拡大するゲームです.ブラックジャックはカジノごとに異なる規定を持っている.
韓国最高のブラックジャックの達人である金正仁(キム・ジョンイン)氏は、サングン、チャンヨン氏と新しいブラックジャックルールを制定し、ゲームを行う.
金正仁バージョンの黒いジャックには、カードごとに正の整数が書かれています.その後、ディーラーはすべてのN枚のカードを床に置いて、数字を表示します.そしてディーラーはデジタルMを叫んだ.
現在、プレイヤーは限られた時間内にN枚のカードの中から3枚のカードを選ばなければならない.ブラックジャック変形ゲームなので、プレイヤーが選択したカードの和はMを超えず、できるだけMに近づくようにします.
N枚のカードの数字が与えられている場合は、Mを超えずにMに最も近いカード3枚の合計を求めて出力してください.

私の理解


与えられた数字を組み合わせて、3つの長さ和を求め、Mと一致したり近づけたりすればよい.
import sys
from itertools import permutations

n,m =  map(int, sys.stdin.readline().split())
read2 =  list(map(str, sys.stdin.readline().split()))


a = list(permutations(read2,3))
maxima =0
for ele in a:
    summa = int(ele[0])+int(ele[1]) + int(ele[2])
    if summa <= m:
        if summa> maxima:
            maxima = summa
print(maxima)
Pythonでは、配列を使って簡単に解くことができます.自分で組み合わせを作って、組み合わせの組み合わせを求めてmaximaに保存して解くことができます.

C++

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

int main()
{
   ios_base :: sync_with_stdio(false); 
    cin.tie(NULL); 
    cout.tie(NULL);
   
   int a,b;
   cin >> a>>b;
   vector <int> card;
   vector <int> comb;
   for(int i=0;i<3;i++){
       comb.push_back(0);
   }
   for(int i=0;i<a-3;i++){
       comb.push_back(1);
   }
   
   
   
   for(int i =0;i<a;i++){
       int d;
       cin >>d;
       card.push_back(d);
   }
   sort(card.begin(),card.end());
   int sum =0;
   int max = -1;
   do{

		for (int i = 0; i < comb.size(); i++) {
		    if(comb[i]==0){
		        sum+= card[i];
		    }
		}
		if (sum <= b){
		    if (sum>max){
		        max = sum;
		    }
		}
		sum =0;
	
	}while(next_permutation(comb.begin(),comb.end()));
    cout<< max;
   return 0;
}
C++はnext置換も使用できます.ただ3つの数字の組み合わせを探すので、combという配列で調整します.0は値切る、1はスキップする.