白駿Baekjoon 2798ブラックジャック-JAVA


https://www.acmicpc.net/problem/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枚のカードの合計を超えないように出力されます.
入力例1
5 21
5 6 7 8 9
サンプル出力1
21
入力例2
10 500
93 181 245 214 315 36 185 138 216 295
サンプル出力2
497
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String[] strArr1 = br.readLine().split(" ");
		String[] strArr2 = br.readLine().split(" ");

		int N = Integer.parseInt(strArr1[0]);
		int M = Integer.parseInt(strArr1[1]);

		int[] arr = new int[N];
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(strArr2[i]);
		}

		System.out.println(search(arr, N, M));
	}

	// 탐색
	static int search(int[] arr, int N, int M) {
		int result = 0;
		for (int i = 0; i < N - 2; i++) {
			if (arr[i] > M) // 예외처리
				continue;
			for (int j = i + 1; j < N - 1; j++) {
				if (arr[i] + arr[j] > M) // 예외처리
					continue;
				for (int k = j + 1; k < N; k++) {
					int temp = arr[i] + arr[j] + arr[k];

					if (M == temp) // 동일값 생성 시 리턴
						return temp;

					if (result < temp && temp < M) // 세 카드의 합이 이전 합보다 크면서 M 보다 작을 경우 result 갱신
						result = temp;
				}
			}
		}
		return result;
	}
}
  • 説明
  • 演算量
  • n-2、n-1、n
  • 現在の計算値がMより大きい場合は異常処理
  • を継続する.
  • 値がMの場合の異常処理