皇室成员的名字

#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

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
using namespace std;
struct p
{
	string s1,s2;
}Name[100005];
map<char,int> T;
void Init()
{
	T.insert(make_pair('I',1));
	T.insert(make_pair('V',5));
	T.insert(make_pair('X',10));
	T.insert(make_pair('L',50));
	T.insert(make_pair('C',100));
	T.insert(make_pair('D',500));
	T.insert(make_pair('M',1000));
}
int romanToInt(string s) 
{                        
	int len=s.length();
    int sum = T[s[len-1]];
    for (int i = len - 2; i >= 0; --i) 
    {
        if (T[s[i]] < T[s[i + 1]])
        {
            sum -= T[s[i]];
        }
        else
        {
            sum += T[s[i]];
        }
    }
   	return sum;
}
bool cmp(const p&a,const p&b)
{
	return  a.s1<b.s1||a.s1==b.s1&&romanToInt(a.s2)<romanToInt(b.s2);
}
int main()
{
	int t;
	Init();
	cin>>t;
	for(int i=0;i<t;++i)
	{
		cin>>Name[i].s1>>Name[i].s2;
	}
	sort(Name,Name+t,cmp);
	for(int i=0;i<t;++i)
	{
		cout<<Name[i].s1<<" "<<Name[i].s2<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值