トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.216 FAC

■■■問題■■■

K君はプログラミングコンテストに参加するのが大好きです。
今日もFAC(First Accept Contest)に参加します。

FACは変わったコンテストで、各問題一番最初に解いた人にしかスコアが加算されません。
最終的にスコアが一番高かった人が優勝します。

K君はコンテストに少し遅れて参加することになってしまいました。
既にいくつかの問題は解かれてしまっています。

K君はプロなので全ての問題を一瞬で解くことができます。
遅れて参加したK君が優勝できるなら"YES"、できないなら"NO"を出力してください。

1位の人と同じスコアだった場合も優勝とみなします。
コンテストにはK君以外に100人参加します。 

■■■入力■■■

N
a0 ・・・ aN-1
b0 ・・・ bN-1

1行目に問題の個数Nが与えられます。
2行目にi番目の問題のスコアが空白区切りで与えられます。
3行目にi番目の問題が何番の人に解かれたかが空白区切りで与えられます。
biが0の場合はまだ誰にも解かれていないことを表します。

全て整数で与えられます。
1 <= N  <= 100
1 <= ai <= 100
0 <= bi <= 100

■■■出力■■■

K君が優勝できるなら"YES"、できないなら"NO"を出力してください。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input4";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("4");
            WillReturn.Add("1 100 100 100");
            WillReturn.Add("0 1 2 3");
            //NO
            //1点の問題しか残っていません
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            WillReturn.Add("10 20 30");
            WillReturn.Add("1 0 0");
            //YES
            //50点取れるので優勝できます
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("3");
            WillReturn.Add("10 20 30");
            WillReturn.Add("0 0 1");
            //YES
            //同点でも優勝です
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int[] AArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray();
        int[] BArr = InputList[2].Split(' ').Select(X => int.Parse(X)).ToArray();

        var ScoreSumDict = new Dictionary<int, int>();

        for (int I = 0; I <= BArr.GetUpperBound(0); I++) {
            if (ScoreSumDict.ContainsKey(BArr[I]))
                ScoreSumDict[BArr[I]] += AArr[I];
            else ScoreSumDict[BArr[I]] = AArr[I];
        }

        int RestScore = (ScoreSumDict.ContainsKey(0) ? ScoreSumDict[0] : 0);
        if (ScoreSumDict.Where(X => X.Key > 0).Any(X => X.Value > RestScore)) {
            Console.WriteLine("NO");
        }
        else Console.WriteLine("YES");
    }
}


解説

ナイーブに解いてます。