1 条题解

  • 0
    @ 2025-8-24 22:32:58

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar aaaaaawsl
    即使无天雨,我亦留此地

    搬运于2025-08-24 22:32:58,当前版本为作者最后更新于2021-08-04 17:07:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    无智商解法

    没有高级的算法,没有奇异的思路,枚举才是王道。
    本题需要将每一种罗马数字的字符重新排列,输出排列后最小的数字。
    注意数据范围 1B<1001≤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;
    }
    
    • 1

    信息

    ID
    7095
    时间
    1000ms
    内存
    32MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者