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を求めてます。