#1566 : 皇室成员的名字
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Ho正在学习世界历史。他发现历史上很多西方国家的皇室成员的名字都是由英文名字加罗马数字组成的,例如George IV(乔治四世)、William IV(威廉四世)、Elizabeth II(伊丽莎白二世)等。
为了更好的梳理历史脉络,小Ho决定写个程序把历史书上出现过的皇室名字排序:首先按英文名字的字典序排序,如果英文名字相同,再按罗马数字从小到大的顺序排序。
罗马数字表示可以参考 https://en.wikipedia.org/wiki/Roman_numerals 中的"standard forms"。
输入
第一行包含一个整数N,表示名字的总数。
以下N行每行包含一个名字。英文名字与罗马数字之间由一个空格隔开。其中英文名字首字母是大写字母,其余字母是小写字母。
对于100%的数据,1 ≤ N ≤ 100000, 罗马数字 < 4000
输出
输出N行,每行一个名字。
- 样例输入
-
5 Elizabeth II Elizabeth C William IV Hiho MMXVII Hiho MMXVII
- 样例输出
-
Elizabeth II Elizabeth C Hiho MMXVII Hiho MMXVII William IV
1 #include<bits/stdc++.h> 2 #define pb push_back 3 using namespace std; 4 const int maxn = 1e3 + 10; 5 struct node {//结构体保存数据 6 string v; 7 string t; 8 int id; 9 node() { 10 id = 0; 11 } 12 node(string x, string y, int d) : v(x),t(y),id(d){} 13 bool operator<(const node&x)const {//排序方法 14 if(v == x.v) return id < x.id; 15 return v < x.v; 16 } 17 }; 18 int romanToInt(string s) {//计数阿拉伯数字对应的数值 19 int tagVal[256]; 20 tagVal['I'] = 1; 21 tagVal['V'] = 5; 22 tagVal['X'] = 10; 23 tagVal['C'] = 100; 24 tagVal['M'] = 1000; 25 tagVal['L'] = 50; 26 tagVal['D'] = 500; 27 int val = 0; 28 for(int i = 0; i < s.length(); i++){ 29 if(i+1 >= s.length() || tagVal[s[i+1]] <= tagVal[s[i]]) 30 val += tagVal[s[i]]; 31 else 32 val -= tagVal[s[i]]; 33 } 34 return val; 35 } 36 37 int main() { 38 int n; 39 vector<node> a; 40 string x, y; 41 cin >> n; 42 for (int i = 0; i < n; i++) { 43 cin >> x >> y; 44 node t(x, x+" " + y, romanToInt(y)); 45 a.pb(t); 46 } 47 sort(a.begin(), a.end()); 48 for (node&t:a) 49 cout << t.t << endl; 50 return 0; 51 }