AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC308-C Standings
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("3");
WillReturn.Add("1 3");
WillReturn.Add("3 1");
WillReturn.Add("2 2");
//2 3 1
}
else if (InputPattern == "Input2") {
WillReturn.Add("2");
WillReturn.Add("1 3");
WillReturn.Add("2 6");
//1 2
}
else if (InputPattern == "Input3") {
WillReturn.Add("4");
WillReturn.Add("999999999 1000000000");
WillReturn.Add("333333333 999999999");
WillReturn.Add("1000000000 999999997");
WillReturn.Add("999999998 1000000000");
//3 1 4 2
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
////////////////////////////////////////////////////////////////
// ソートを定義した構造体
////////////////////////////////////////////////////////////////
struct SortableStruct : IComparable<SortableStruct>
{
internal long No;
internal decimal A;
internal decimal B;
public int CompareTo(SortableStruct pOtherIns)
{
decimal Sahen = A * (pOtherIns.A + pOtherIns.B);
decimal Uhen = pOtherIns.A * (A + B);
if (Sahen > Uhen) {
return -1;
}
if (Sahen < Uhen) {
return 1;
}
return No.CompareTo(pOtherIns.No);
}
}
static List<SortableStruct> mList = new List<SortableStruct>();
static void Main()
{
List<string> InputList = GetInputList();
decimal[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
int CurrNo = 1;
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
SortableStruct WillAdd;
WillAdd.No = CurrNo++;
WillAdd.A = wkArr[0];
WillAdd.B = wkArr[1];
mList.Add(WillAdd);
}
mList.Sort();
var AnswerList = new List<long>();
foreach (SortableStruct EachItem in mList) {
AnswerList.Add(EachItem.No);
}
Console.WriteLine(LongEnumJoin(" ", AnswerList));
}
// セパレータとLong型の列挙を引数として、結合したstringを返す
static string LongEnumJoin(string pSeparater, IEnumerable<long> pEnum)
{
string[] StrArr = Array.ConvertAll(pEnum.ToArray(), pX => pX.ToString());
return string.Join(pSeparater, StrArr);
}
}
解説
ソートを定義した構造体で
不等式を変形してソートしてます。