hihoCoder 1566 皇室成员的名字

皇室成员的名字

题目链接:https://hihocoder.com/problemset/problem/1566

Description

小Ho正在学习世界历史。他发现历史上很多西方国家的皇室成员的名字都是由英文名字加罗马数字组成的,例如George IV(乔治四世)、William IV(威廉四世)、Elizabeth II(伊丽莎白二世)等。  

为了更好的梳理历史脉络,小Ho决定写个程序把历史书上出现过的皇室名字排序:首先按英文名字的字典序排序,如果英文名字相同,再按罗马数字从小到大的顺序排序。  

罗马数字表示可以参考 https://en.wikipedia.org/wiki/Roman_numerals 中的"standard forms"。

Input

第一行包含一个整数N,表示名字的总数。

以下N行每行包含一个名字。英文名字与罗马数字之间由一个空格隔开。其中英文名字首字母是大写字母,其余字母是小写字母。  

对于100%的数据,1 ≤ N ≤ 100000, 罗马数字 < 4000

Output

输出N行,每行一个名字。

 

Sample Input

5  
Elizabeth II  
Elizabeth C 
William IV  
Hiho MMXVII  
Hiho MMXVII

Sample Output

Elizabeth II
Elizabeth C
Hiho MMXVII  
Hiho MMXVII    
William IV

 


题意:

给定一些名字,名字包括英文字母以及罗马数字,以英文字母为第一关键字,罗马数字为第二关键字进行排序。

题解:

水题。预处理罗马数字。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<char,int> MAP;
 4 void init()
 5 {
 6     MAP['I']=1;
 7     MAP['V']=5;
 8     MAP['X']=10;
 9     MAP['L']=50;
10     MAP['C']=100;
11     MAP['D']=500;
12     MAP['M']=1000;
13 }
14 int Trans(char *str)
15 {
16     int Len=strlen(str);
17     int sum=0;
18     int i=0;
19     while(i<Len)
20     {
21         if(i<Len-1)
22         {
23             if(MAP[str[i+1]]>MAP[str[i]])    sum-=MAP[str[i]];
24             else sum+=MAP[str[i]];
25         }else sum+=MAP[str[i]];
26         ++i;
27     }
28     return sum;
29 }
30 
31 const int MAXN = 100000+10;
32 struct word{
33     char S[1000];
34     char xx[1000];
35     int num;
36 }W[MAXN];
37 
38 bool cmp(const word &a,const word &b)
39 {
40     int pos=strcmp(a.S,b.S);
41     if(pos!=0)  return pos<0;
42     return a.num<b.num;
43 }
44 
45 char str[1000];
46 
47 int main()
48 {
49     init();
50     int N;
51     scanf("%d",&N);
52     for(int i=0;i<N;i++)
53     {
54         scanf("%s%s",W[i].S,W[i].xx);
55         W[i].num=Trans(W[i].xx);
56     }
57     sort(W,W+N,cmp);
58     for(int i=0;i<N;++i)
59     {
60         printf("%s %s\n",W[i].S,W[i].xx);
61     }
62     return 0;
63 }

 

题解链接:http://www.cnblogs.com/scidylanpno/p/7470478.html

版权所有:scidylanpno

转载于:https://www.cnblogs.com/scidylanpno/p/7470478.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值