字符串
好玩的题,前置知识:罗马数字中 L 表示 $50$,C 表示 $100$。罗马数字的表示法。
首先生成每个数字,生成之后把数字的每一位排序再查询 unordered_map
,如果这个数字可以重排得到更小的数,那么这个更小的数在此前已经出现过了,否则这个数字就是组成它的字母重排后能得到的最小的数。
时间复杂度 $O(1)$。
#include<bits/stdc++.h>
using namespace std;
unordered_map<string,string> ans;
unordered_map<int,string> ex;
string s;
int main(){
ex[1]="I",ex[2]="II",ex[3]="III",ex[4]="IV",ex[5]="V";
ex[6]="VI",ex[7]="VII",ex[8]="VIII",ex[9]="IX";
ex[10]="X",ex[20]="XX",ex[30]="XXX",ex[40]="XL",ex[50]="L";
ex[60]="LX",ex[70]="LXX",ex[80]="LXXX",ex[90]="XC";
for(int i=1;i<=99;i++){
if(!ex.count(i)) ex[i]=ex[i-i%10]+ex[i%10];
s=ex[i],sort(s.begin(),s.end());
if(!ans.count(s)) ans[s]=ex[i];
}
cin>>s;
sort(s.begin(),s.end());
cout<<ans[s]<<'\n';
return 0;
}