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