字符串

好玩的题,前置知识:罗马数字中 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;
}
最后修改:2024 年 07 月 23 日
如果觉得我的文章对你有用,请随意赞赏