AtCoderのARC    次のARCの問題へ    前のARCの問題へ

ARC043-A 点数変換


問題へのリンク


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("5 2 4");
            WillReturn.Add("2");
            WillReturn.Add("4");
            WillReturn.Add("6");
            WillReturn.Add("8");
            WillReturn.Add("10");
            //0.5 -1
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("13 29 31");
            WillReturn.Add("3");
            WillReturn.Add("1");
            WillReturn.Add("4");
            WillReturn.Add("1");
            WillReturn.Add("5");
            WillReturn.Add("9");
            WillReturn.Add("2");
            WillReturn.Add("6");
            WillReturn.Add("5");
            WillReturn.Add("3");
            WillReturn.Add("5");
            WillReturn.Add("8");
            WillReturn.Add("9");
            //3.875 10.8173076
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("5 1 2");
            WillReturn.Add("34");
            WillReturn.Add("34");
            WillReturn.Add("34");
            WillReturn.Add("34");
            WillReturn.Add("34");
            //-1
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        decimal[] wkArr = InputList[0].Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
        decimal A = wkArr[1]; // 平均
        decimal B = wkArr[2]; // 最大値と最小値の差

        decimal[] SArr = InputList.Skip(1).Select(pX => decimal.Parse(pX)).ToArray();

        // P倍して、Qを足す調整を行う
        decimal MinVal = SArr.Min();
        decimal MaxVal = SArr.Max();

        decimal MaxMinDiff = MaxVal - MinVal;

        if (MaxMinDiff == 0M) {
            Console.WriteLine(-1);
            return;
        }
        decimal P = B / MaxMinDiff;

        decimal CurrSum = SArr.Sum() * P;
        decimal MustSum = SArr.Length * A;
        decimal SumDiff = MustSum - CurrSum;
        decimal Q = SumDiff / SArr.Length;

        Console.WriteLine("{0} {1}", P, Q);
    }
}


解説

点数調整は、P倍とQを足すことしかできないので

調整前の得点をX
調整後の得点をY
とすると

Y = PX + Q
になります。

最大値と最小値の差は、
全ての要素にQを足しても変わらなく、
全ての要素をP倍すれば、
最大値と最小値の差がP倍になるので
先にPを決定します。

次は、要素数は決まってるので
平均と総和が1対1なので、
現在の総和と、あるべき総和の値から
Qを求めてます。