洛谷P7773题解!

· · 题解

无智商解法

没有高级的算法,没有奇异的思路,枚举才是王道。
本题需要将每一种罗马数字的字符重新排列,输出排列后最小的数字。
注意数据范围 1≤B<100
枚举 100 个数还在我的承受范围内。

然而把 1 至 100 的数全部枚举一遍显然不是我的风格。
观察罗马数字,可以发现除了 40 至 49 ,其他数字中的‘ L ’字符一定在开头。
那么可以将开头的‘ L ’提取出来,剩下的字符按照正常方式判断,在最后将‘ L ’补进去。
以上操作可以使用 string 自带的 substr 操作来执行。

但是以‘ L ’字符开头的罗马数字中还有一部分需要特殊判断。
例如:罗马数字 LXI 就可以将‘ X ’字符放在前面,排列成 XLI
因此需要对这部分内容特殊判断。

枚举最重要的部分就是代码,上代码。

#include <bits/stdc++.h>
using namespace std;
string opt(string s){
    string ss;
    if(s[0]=='L'){
        if(s=="LXI"||s=="LIX") return "XLI";
        if(s=="LXII"||s=="LIXI") return "XLII";
        if(s=="LXIII") return "XLIII";
        if(s=="LXIV"||s=="LXVI") return "XLIV";
        if(s=="LXV") return "XLV";
        if(s=="LXVII") return "XLVII"; 
        if(s=="LXVIII") return "XLVIII";
        if(s=="LXIX"||s=="LXXI") return "XLIX"; //对"LX"的特殊判断 
        ss="L"; //在返回的时候和'L'字符一起返回(若s的开头不为'L',ss为空,不干扰结果) 
        s=s.substr(1,s.length()-1); //若s不在特殊判断范围内,使用substr函数去掉'L'字符,其余部分按照正常方法判断 
    }
    //1至9 
    if(s=="I"||s=="II"||s=="III"||s=="IV"||s=="V"||s=="VII"||s=="VIII"||s=="IX") return ss+s;
    if(s=="VI") return ss+"IV";
    //10至19 
    if(s=="X"||s=="XII"||s=="XIII"||s=="XIV"||s=="XV"||s=="XVII"||s=="XVIII"||s=="XIX") return ss+s;
    if(s=="XI") return ss+"IX";
    if(s=="XVI") return ss+"XIV";
    //20至29
    if(s=="XX"||s=="XXII"||s=="XXIII"||s=="XXIV"||s=="XXV"||s=="XXVII"||s=="XXVIII"||s=="XXIX") return s;
    if(s=="XXI") return ss+"XIX"; 
    if(s=="XXVI") return ss+"XXIV";
    //30至39
    if(s=="XXX"||s=="XXXII"||s=="XXXIII"||s=="XXXIV"||s=="XXXV"||s=="XXXVII"||s=="XXXVIII"||s=="XXXIX") return ss+s;
    if(s=="XXXI") return ss+"XXIX"; 
    if(s=="XXXVI") return ss+"XXXIV";
    //40至49
    if(s=="XLI"||s=="XLII"||s=="XLIII"||s=="XLIV"||s=="XLV"||s=="XLVII"||s=="XLVIII"||s=="XLIX") return ss+s;
    if(s=="XLVI") return ss+"XLIV";
    //90至100 
    if(s=="XC"||s=="XCI"||s=="XCII"||s=="XCIII"||s=="XCIV"||s=="XCV"||s=="XCVII"||s=="XCVIII"||s=="XCIX"||s=="C") return ss+s;
    if(s=="XCVI") return ss+"XCIV";
} //得到排列前得罗马数字,返回排列后的罗马数字 
int main(){
    string s;
    cin>>s;
    cout<<opt(s)<<endl;
    return 0;
}