mayoko’s diary

プロコンとかいろいろ。

SRM 529 div1 easy: KingSort

だいぶ頭悪かったかも…

解法

やるだけなんですが, だいぶ頭が悪かったです。

map を作るところまでは良いと思いますが, あとは

vector<string> ones = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
vector<string> tens = {"","X","XX","XXX","XL","L"};
for (int i = 0; i < ones.size(); i++) for (int j = 0; j < tens.size(); j++) {
    if (tens[j]+ones[i] == s) n = j*10+i
}

とかやるのが良さそうです(適当に書いたのでコンパイル通るかわかりません)。

int parse(string s) {
    int ret = 0;
    if (s.substr(0, 1) == "X") ret = 10;
    if (s.substr(0, 2) == "XX") ret = 20;
    if (s.substr(0, 3) == "XXX") ret = 30;
    if (s.substr(0, 2) == "XL") ret = 40;
    if (s.substr(0, 1) == "L") ret = 50;
    if (ret == 40 || ret == 20) s = s.substr(2);
    else if (ret == 30) s = s.substr(3);
    else if (ret == 10 || ret == 50) s = s.substr(1);
    if (s == "I") ret += 1;
    if (s == "II") ret += 2;
    if (s == "III") ret += 3;
    if (s == "IV") ret += 4;
    if (s == "V") ret += 5;
    if (s == "VI") ret += 6;
    if (s == "VII") ret += 7;
    if (s == "VIII") ret += 8;
    if (s == "IX") ret += 9;
    return ret;
}

bool comp(const string& s, const string& t) {
    return parse(s) < parse(t);
}

class KingSort {
public:
    vector <string> getSortedList(vector <string> kings) {
        map<string, vector<string> > mp;
        for (string s : kings) {
            stringstream ss(s);
            string name, number;
            ss >> name >> number;
            mp[name].push_back(number);
        }
        for (auto& p : mp) {
            sort(p.second.begin(), p.second.end(), comp);
        }
        vector<string> ret;
        for (auto p : mp) {
            for (string s : p.second) {
                ret.push_back(p.first + " " + s);
            }
        }
        return ret;
    }