AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC145-E All-you-can-eat
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("2 60");
WillReturn.Add("10 10");
WillReturn.Add("100 100");
//110
}
else if (InputPattern == "Input2") {
WillReturn.Add("3 60");
WillReturn.Add("10 10");
WillReturn.Add("10 20");
WillReturn.Add("10 30");
//60
}
else if (InputPattern == "Input3") {
WillReturn.Add("3 60");
WillReturn.Add("30 10");
WillReturn.Add("30 20");
WillReturn.Add("30 30");
//50
}
else if (InputPattern == "Input4") {
WillReturn.Add("10 100");
WillReturn.Add("15 23");
WillReturn.Add("20 18");
WillReturn.Add("13 17");
WillReturn.Add("24 12");
WillReturn.Add("18 29");
WillReturn.Add("19 27");
WillReturn.Add("23 21");
WillReturn.Add("18 20");
WillReturn.Add("27 15");
WillReturn.Add("22 25");
//145
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct ABInfoDef
{
internal int A;
internal int B;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();
SplitAct(InputList[0]);
int T = wkArr[1];
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);
}
// Aの昇順にソートしておく
ABInfoList.Sort((pA, pB) => pA.A.CompareTo(pB.A));
// 美味しさ合計の最大[時間合計]なDP表
int?[] DPArr = new int?[T + 1];
DPArr[0] = 0;
foreach (ABInfoDef EachABInfo in ABInfoList) {
for (int I = T - 1; 0 <= I; I--) {
if (DPArr[I].HasValue == false) continue;
int NewI = I + EachABInfo.A;
NewI = Math.Min(NewI, T);
int NewVal = DPArr[I].Value + EachABInfo.B;
if (DPArr[NewI].HasValue) {
if (DPArr[NewI].Value >= NewVal) {
continue;
}
}
DPArr[NewI] = NewVal;
}
}
Console.WriteLine(DPArr.Max());
}
}
解説
美味しさ合計の最大[時間合計]を更新するインラインDPで解いてます。
時間合計がT以上になったら、料理が取れなくなるので、
ナップサック問題で、ナップサックの容量が10で
9,1,2,3という荷物があると考えれば、
荷物は、重さの昇順に見ていく必要があると分かります。