トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-118-B Foods Loved by Everyone
■■■問題■■■
カツサンドくんはオムライスが好きです。
他にも明太子や寿司、クリームブリュレやテンダーロインステーキなどが好きで、
これらの食べ物は全て、誰もが好きだと信じています。
その仮説を証明するために、N人の人にM種類の食べ物について好きか嫌いかの調査を行いました。
調査の結果、i番目の人は、Ai1番目 , Ai2番目 , ... , AiKi番目の食べ物だけ好きだと答えました。
N人全ての人が好きだと答えた食べ物の種類数を求めてください。
■■■入力■■■
N M
K1 A11 A12 ・・・ A1K1
K2 A21 A22 ・・・ A2K2
・
・
・
KN AN1 AN2 ・・・ ANKN
●入力は全て整数である
●1 <= N,M <= 30
●1 <= Ki <= 30
●1 <= Aij <= M
●各i (1 <= i <= N) について Ai1 , Ai2 , ・・・ , AiKi は全て異なる。
■■■出力■■■
N人全ての人が好きだと答えた食べ物の種類数を出力せよ。
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("3 4");
WillReturn.Add("2 1 3");
WillReturn.Add("3 1 2 3");
WillReturn.Add("2 3 2");
//1
//3人全員が好きだと答えた食べ物は
//3番目の食べ物だけなので1を出力します。
}
else if (InputPattern == "Input2") {
WillReturn.Add("5 5");
WillReturn.Add("4 2 3 4 5");
WillReturn.Add("4 1 3 4 5");
WillReturn.Add("4 1 2 4 5");
WillReturn.Add("4 1 2 3 5");
WillReturn.Add("4 1 2 3 4");
//0
//カツサンドくんの仮説は全く正しくありませんでした。
}
else if (InputPattern == "Input3") {
WillReturn.Add("1 30");
WillReturn.Add("3 5 10 30");
//3
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
var AArrList = new List<int[]>();
foreach (string EachStr in InputList.Skip(1)) {
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(X => int.Parse(X)).Skip(1).ToArray();
SplitAct(EachStr);
AArrList.Add(wkArr);
}
var IntersectSet = new HashSet<int>(AArrList[0]);
for (int I = 1; I <= AArrList.Count - 1; I++) {
IntersectSet.IntersectWith(AArrList[I]);
}
Console.WriteLine(IntersectSet.Count);
}
}
解説
HashSetジェネリックで、IntersectWithメソッドを繰り返してます。