标签:pac coder sam 国家 get 参考 文字 数字 strcmp
题目链接:https://hihocoder.com/problemset/problem/1566
小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 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
标签:pac coder sam 国家 get 参考 文字 数字 strcmp
原文地址:http://www.cnblogs.com/scidylanpno/p/7470478.html