題目鏈接:http://hihocoder.com/problemset/problem/1566
【中文題意】
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
【思路分析】將羅馬數字轉化爲正常的數字,然後結構體排序就好了。
【AC代碼】
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
using namespace std;
struct node
{
char name[20];
char s[20];
int val;
}Peo[100005];
char str[10]="IVXLCDM";
int num[10]={1,5,10,50,100,500,1000};
bool cmp(node x,node y)
{
if(strcmp(x.name,y.name)==0)
{
return x.val<y.val;
}
else
{
return strcmp(x.name,y.name)<0;
}
}
int tran(char *s)
{
int len=strlen(s);
int cnt=0,a[20];
for(int i=0; i<len; i++)
{
int f=0,t;
if(s[i]==s[i+1]&&i!=len-1)
{
if(s[i]==s[i+2]&&i!=len-2)
{
f=2;
}
else
f=1;
}
for(int k=0; k<7; k++)
if(s[i]==str[k])
{
t=k;
break;
}
a[cnt++]=num[t]*(f+1);
i+=f;
}
int sum=0;
for(int i=0; i<cnt; i++)
sum+=a[i];
for(int i=0; i<cnt-1; i++)
{
if(a[i]<a[i+1])sum-=2*a[i];
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%s %s",&Peo[i].name,&Peo[i].s);
Peo[i].val=tran(Peo[i].s);
}
sort(Peo,Peo+n,cmp);
for(int i=0;i<n;i++)
{
printf("%s %s\n",Peo[i].name,Peo[i].s);
}
}
return 0;
}