トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

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);
    }
}


解説

最小値のみの集合の場合に平均は最小になり、
最大値のみの集合の場合に平均は最大になる。
ということをふまえてます。