トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.29 パワーアップ
■■■問題■■■
Quinは、RPGをしている。
そのRPGでは、アイテムは10種類(それぞれ番号付けされている)あり、
「同じアイテム」を2つ揃えるか、
「任意のアイテム」を4つ揃えるとパワーアップする仕組みがある。
そして敵を倒したら、何かアイテムを3つもらうことができる。(同じアイテムがもらえることもある。)
このとき、持てるアイテムの上限はないとし、アイテムの組み合わせは自由に決められる。
(自動的にパワーアップすることはないとする。)
N回敵を倒すと考えたとき、その時のパワーアップする最大の回数を求めてください。
■■■入力■■■
N
a1 b1 c1
a2 b2 c2
・・・・
aN bN cN
1行目に敵を倒す回数を表すN (1 <= N <= 100)が与えられる。
2行目以降はi(1 <= i <= N)回目で敵を倒した時のもらえる3つのアイテムの番号
ai,bi,ci (1 <= ai,bi,ci < =10)が半角空白区切りで与えられる。
■■■出力■■■
最大のパワーアップする回数を文字列で出力してください。出力の末尾には改行をいれること。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("5");
WillReturn.Add("1 2 3");
WillReturn.Add("4 5 6");
WillReturn.Add("7 8 9");
WillReturn.Add("10 1 2");
WillReturn.Add("3 4 5");
//6
//アイテム1,2,3,4,5が2つ揃ったので パワーアップを5回できる。
//さらにアイテム 6,7,8,9を使い、更にパワーアップするでき、
//合計6回パワーアップすることができる。
}
else if (InputPattern == "Input2") {
WillReturn.Add("3");
WillReturn.Add("1 1 1");
WillReturn.Add("1 1 1");
WillReturn.Add("1 1 1");
//4
}
else if (InputPattern == "Input3") {
WillReturn.Add("3");
WillReturn.Add("1 2 3");
WillReturn.Add("5 4 1");
WillReturn.Add("1 9 2");
//3
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
IEnumerable<int> EnumItem =
InputList.Skip(1).SelectMany(X => X.Split(' '), (X, Y) => int.Parse(Y));
int PowerUpCnt = 0;
//アイテムごとのCountを求める
var Query = EnumItem.GroupBy(X => X).Select(X => new { X.Key, cnt = X.Count() });
//同じアイテムが2つあればパワーアップ
PowerUpCnt += Query.Sum(X => X.cnt / 2);
//アイテムを4つ使ってパワーアップ
PowerUpCnt += Query.Sum(X => X.cnt % 2) / 4;
Console.WriteLine(PowerUpCnt);
}
}
解説