AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC187-D Choose Me
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4");
WillReturn.Add("2 1");
WillReturn.Add("2 2");
WillReturn.Add("5 1");
WillReturn.Add("1 3");
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("5");
WillReturn.Add("2 1");
WillReturn.Add("2 1");
WillReturn.Add("2 1");
WillReturn.Add("2 1");
WillReturn.Add("2 1");
//3
}
else if (InputPattern == "Input3") {
WillReturn.Add("1");
WillReturn.Add("273 691");
//1
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct ABInfoDef
{
internal long A;
internal long B;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(X => long.Parse(X)).ToArray();
var ABInfoList = new List<ABInfoDef>();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
ABInfoDef WillAdd;
WillAdd.A = wkArr[0];
WillAdd.B = wkArr[1];
ABInfoList.Add(WillAdd);
}
// 全く演説しなかった時の青木君の得票数
long CurrSumAoki = ABInfoList.Sum(pX => pX.A);
// 全く演説しなかった時の高橋君の得票数
long CurrSumTakahashi = 0;
// 2*A+Bの降順で貪欲法
var Query = ABInfoList.OrderByDescending(pX => 2 * pX.A + pX.B);
long Answer = 1;
foreach (ABInfoDef EachABInfo in Query) {
CurrSumAoki -= EachABInfo.A;
CurrSumTakahashi += EachABInfo.A + EachABInfo.B;
if (CurrSumAoki < CurrSumTakahashi) {
break;
}
Answer++;
}
Console.WriteLine(Answer);
}
}
解説
二分法を使う必要がなく、貪欲法で解けます。