トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-072-C Together
■■■問題■■■
長さNの整数列 a1,a2,・・・ ,aN が与えられます。
各 1 <= i <= N に対し、
aiに1足すか、1引くか、なにもしないかの3つの操作からどれか1つを選んで行います。
この操作の後、ある整数Xを選んで、ai=X となるiの個数を数えます。
うまく操作を行い、Xを選ぶことで、この個数を最大化してください。
■■■入力■■■
N
a1 a2 ・・・ aN
●1 <= N <= 10万
●0 <= ai < 10万 (1 <= i <= N)
●aiは整数
■■■出力■■■
うまく操作を行い、Xを選んだ時の ai=X なるiの個数の最大値を出力せよ。
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("7");
WillReturn.Add("3 1 4 1 5 9 2");
//4
//例えば操作後の数列を 2,2,3,2,6,9,2 とすることができて、
//X=2 とすると4を得ることができ、これが最大です。
}
else if (InputPattern == "Input2") {
WillReturn.Add("10");
WillReturn.Add("0 1 2 3 4 5 6 7 8 9");
//3
}
else if (InputPattern == "Input3") {
WillReturn.Add("1");
WillReturn.Add("99999");
//1
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] AArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray();
var CntDict = new Dictionary<int, int>();
foreach (int EachInt in AArr) {
Action<int> AddAct = (pInt) =>
{
if (CntDict.ContainsKey(pInt))
CntDict[pInt]++;
else CntDict[pInt] = 1;
};
AddAct(EachInt - 1);
AddAct(EachInt);
AddAct(EachInt + 1);
}
Console.WriteLine(CntDict.Values.Max());
}
}
解説
1足す。そのまま。1引く。の3通りの値の個数を集計してます。