AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC376-C Prepare Another Box
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("5 2 3 7");
WillReturn.Add("6 2 8");
//3
}
else if (InputPattern == "Input2") {
WillReturn.Add("4");
WillReturn.Add("3 7 2 5");
WillReturn.Add("8 1 6");
//-1
}
else if (InputPattern == "Input3") {
WillReturn.Add("8");
WillReturn.Add("2 28 17 39 57 56 37 32");
WillReturn.Add("34 27 73 28 76 61 27");
//37
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static int[] mAArr;
static List<int> mBList;
static void Main()
{
List<string> InputList = GetInputList();
mAArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
mBList = InputList[2].Split(' ').Select(pX => int.Parse(pX)).ToList();
Array.Sort(mAArr);
int L = 0;
int R = mAArr.Max();
// Rが達成不可な場合
if (CanAchieve(R) == false) {
Console.WriteLine(-1);
return;
}
while (L + 1 < R) {
int Mid = (L + R) / 2;
if (CanAchieve(Mid)) {
R = Mid;
}
else {
L = Mid;
}
}
Console.WriteLine(R);
}
// X以下にできるかを返す
static bool CanAchieve(int pX)
{
var CloneBList = new List<int>();
CloneBList.AddRange(mBList);
CloneBList.Add(pX);
CloneBList.Sort();
int UB = mAArr.GetUpperBound(0);
for (int I = 0; I <= UB; I++) {
if (mAArr[I] > CloneBList[I]) {
return false;
}
}
return true;
}
}
解説
答えを二分探索してます。
10の9乗 * 2 は Int型に収まるので
Int型を使用してます。