トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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");
}
}
解説
ナイーブに解いてます。