[標準C+]2798ブラックジャック


質問する


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

入力


第1行は、カードの個数N(3≦N≦100)およびM(10≦M≦300000)を与える.2行目は、100000を超えない正の整数であるカードの数字を与えます.
3枚とMを超えないカードが見つかった場合のみ、入力として使用できます.

しゅつりょく


1行目は、Mに最も近い3枚のカードの合計を超えないように出力されます.
https://www.acmicpc.net/problem/2798
その結果、カードを3回繰り返し抽出することなく、Mに近い値(Mを含む)との最値を出力する.
入力したカードの数は最大100個までです.
100 x 99 x 98=>9万程度で、三重複文を書いても1秒以内に解決できます.
重複を避けるために,内部ではi,j,kがそれぞれ同じ場合を排除した.
#define _CRT_SECURE_NO_WARNINGS //scanf오류 없앰
#include <bits/stdc++.h>


int main(void) {
	int cardNum, M, max = 0;
	scanf("%d%d", &cardNum, &M);
	int* card = new int[cardNum];
	for (int i = 0; i < cardNum; i++){ //모든입력을 받음
		scanf("%d", &card[i]);
	}
	
	for (int i = 0; i < cardNum; i++) {
		for (int j = 0; j < cardNum; j++) {
			if (i == j) continue; //중복X
			for (int k = 0; k < cardNum; k++) {
				if (k == j || i == k) continue; //중복 X
				int sum = card[i] + card[j] + card[k];
				if (sum > M) continue; //M을 넘으면 X
				if (max < sum) max = sum; //최댓값 갱신
			}
		}
	}
	printf("%d", max);
}