トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.21 平均の差
■■■問題■■■
N個の数字が与えられるのでこれらをK ( >= 3) 個のグループに振り分ける。
ただし各グループには最低一つ数字が含まれているとする。
ex) 例えば 与えれる数字が {10,3,23,91,5}, K=3 なら
{ {3,91} , {23,5} , {10} } のような振り分けかたはただしく
{ {} , {3,5,10} , {23,91} } のような振り分けかたは認められません
グループごとに平均を計算し, それらをもとに 最大の平均 - 最小の平均 を計算し、
最後に小数点以下を切り上げその値を「平均の差」と呼ぶ。
平均の差を最も大きくするようなグループ分けをしたとき、平均の差はいくつになるか答えよ。
■■■入力■■■
N
K
n1
n2
・
・
・
nN
1行目にはN (3 <= N <= 9)が与えられる。
2行目にはK (3 <= K <= N)が与えられる。
3行目〜N+2行目には数字(1 <= ni <= 1000 , 1 <= i <= N)が与えられる。
■■■出力■■■
答えの数値を文字列で出力してください。
最後に改行してください。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input3";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("5");
WillReturn.Add("3");
WillReturn.Add("555");
WillReturn.Add("20");
WillReturn.Add("432");
WillReturn.Add("301");
WillReturn.Add("21");
//535
//例えば {{555},{21,20},{433,301}} のようにグループ分けすると
//平均は {555/1,(21+20)/2,(432+301)/2}={555,20.5,366.5} なので
//最大の平均 - 最小の平均は 555 - 20.5 = 534.5
//最後に小数点以下を切り上げて535
}
else if (InputPattern == "Input2") {
WillReturn.Add("8");
WillReturn.Add("4");
WillReturn.Add("329");
WillReturn.Add("980");
WillReturn.Add("656");
WillReturn.Add("738");
WillReturn.Add("739");
WillReturn.Add("542");
WillReturn.Add("873");
WillReturn.Add("501");
//651
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] NArr = InputList.Skip(2).Select(X => int.Parse(X)).ToArray();
int MaxAvg = NArr.Max();
int MinAvg = NArr.Min();
Console.WriteLine(MaxAvg - MinAvg);
}
}
解説
最小値のみの集合の場合に平均は最小になり、
最大値のみの集合の場合に平均は最大になる。
ということをふまえてます。