TopCoder SRM 154 DIV 1 Medium 練習
問題
コンテストの結果をソートしてください。
解
めんどい。やるだけ。
using System; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Collections.Generic; public class Data : IComparable { public string Name; public int Rank, Score; public static int Compare(object a, object b) { Data x = (Data)a, y = (Data)b; if (x.Rank == y.Rank) if (x.Score == y.Score) return x.Name.CompareTo(y.Name); else return y.Score - x.Score; else return x.Rank - y.Rank; } public int CompareTo(object other) { return Data.Compare(this, other); } public override string ToString() { if (Score % 10 == 0) return string.Format("{0} {1} {2}.0", Name, Rank, Score / 10); return string.Format("{0} {1} {2}", Name, Rank, Score / 10.0); } } public class ContestScore { public string[] sortResults(string[] data) { if (data.Length < 1) return new string[0]; Data[] result = new Data[data.Length]; int[][] scores = new int[data.Length][]; for (int i = 0; i < data.Length; ++i) { result[i] = new Data(); result[i].Name = data[i].Split()[0]; result[i].Rank = 0; result[i].Score = 0; scores[i] = new int[data[i].Split().Length - 1]; for (int j = 0; j < scores[i].Length; ++j) { scores[i][j] = (int)(double.Parse(data[i].Split()[j + 1]) * 10); result[i].Score += scores[i][j]; } } for (int i = 0; i < scores[0].Length; ++i) { List<KeyValuePair<int, int>> kvp = new List<KeyValuePair<int, int>>(); for (int j = 0; j < scores.Length; ++j) kvp.Add(new KeyValuePair<int, int>(scores[j][i], j)); kvp.Sort(delegate(KeyValuePair<int, int> a, KeyValuePair<int, int> b) { return b.Key - a.Key; }); int rank = 0, prev = -1, prevc = 1; for (int j = 0; j < kvp.Count; ++j) { if(kvp[j].Key == prev) prevc++; else { rank += prevc; prevc = 1; } result[kvp[j].Value].Rank += rank; prev = kvp[j].Key; } } Array.Sort(result); string[] res = new string[result.Length]; for (int i = 0; i < result.Length; ++i) res[i] = result[i].ToString(); return res; } }