Problem:
カードゲー ム

「1」から「10」までの数字が書かれたカードが各 1 枚、全部で 10 枚あります。このカードは、表側には数字が書かれ、裏側には何も書かれていません。このカードを使って、あなたと相手の 2 名で以下のルールでゲー ムを行います。

あなたと相手には、表を上にして 1 枚、裏を上にして 1 枚、計 2 枚のカードが配られています。あなたは相手の表のカードの数字を見ることができますが、裏のカードの数字は見えません。

配られたカードの数字の合計が 20 以下で、かつ相手の数字の合計より大きいときに勝ちとなります。
例えば、あなたのカードが「7」「8」 (合計 15) 、相手のカードが「9」「10」 (合計 19) のときは、相手の勝ちです。

あなたと相手は最大であと 1 枚カードを引くことができます。それを引かなくても構いません。

ここで、あと 1 枚のカードを引くかどうかを決定する目安として、カードを引いたときに合計が 20 以下に なる確率を考え、その確率が 50% 以上のときはカードを引くこととしましょう。この確率を計算するときには、あなたの 2 枚のカードと相手の表のカードの計3枚のカードの情報を利用することができます。つまり、各カードは 1 枚ずつしかないので、それらのカードを引くことはないことになります。

あなたの 2 枚のカードと相手の表のカードを読み込んで、それぞれについて、あと 1 枚引いたときに合計が 20 以下になる確率が 50% 以上のときは YES、そうでないなら NO を出力するプログラムを作成してください。

Input

入力は複数のデータセットからなります。 1 枚目のあなたのカードの数字を C1 、2 枚目のあなたのカードの数字を C2 、相手の表になっているカードの数字を C3 とすると、各データセットは以下の形式で与えられます。

C1 C2 C3

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

1 2 3
5 6 9
8 9 10

Output for the Sample Input

YES
YES
NO

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;


public class Main {
	private	static	BufferedReader	br = null;

	static {
		br    = new BufferedReader(new InputStreamReader(System.in));
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Integer>	cards = null;
		int[]				aHand = null;

		while((aHand = parseHand()) != null) {
			if (cards == null) {
				cards = new ArrayList<Integer>();
				for (int n = 1; n <= 10; n++) {
					cards.add(n);
				}
			}
			else {
				Collections.sort(cards);
			}

			result(cards, aHand);
		}
	}

	private static int[] parseHand() {
		int[]		aHand = null;
		String[]	as    = null;

		try {
			String line = br.readLine();
			if (line != null) {
				if (!line.isEmpty()) {
					as       = line.split(" ");
					aHand    = new int[3];	
					aHand[0] = Integer.parseInt(as[0]);
					aHand[1] = Integer.parseInt(as[1]);
					aHand[2] = Integer.parseInt(as[2]);
				}
			}
		}
		catch (NumberFormatException e) {}
		catch (IOException e) {}

		return aHand;
	}

	private static void result(ArrayList<Integer> cards, int[] aHand) {
		int		sub    = 20 - aHand[0] - aHand[1];
		boolean	border = true;

		if (sub <= 10) {
			cards.remove((Integer)aHand[0]);
			cards.remove((Integer)aHand[1]);
			cards.remove((Integer)aHand[2]);
			for (int n = 0; n < 4 && border; n++) {
				border = (cards.get(n) <= sub);
			}
			cards.add((Integer)aHand[0]);
			cards.add((Integer)aHand[1]);
			cards.add((Integer)aHand[2]);
		}

		if (border) {
			System.out.println("YES");
		}
		else {
			System.out.println("NO");
		}
	}
}