关于罗马数字(玄关x1)
查看原帖
关于罗马数字(玄关x1)
923403
FallingFYC_楼主2023/6/16 19:49

罗马数字 XLIVII 为什么不合法?

PS:

代码:

40分

#include <bits/stdc++.h>
using namespace std;
map<char , int> alp;
int minn = 100 , lend; 
char d[10] , ans[10];

void init()
{
	alp['I'] = 1; alp['V'] = 5; alp['X'] = 10;
	alp['L'] = 50; alp['C'] = 100;
	return;
}

int main()
{
	init();
    char c = getchar();
	while (isalpha(c))
    {
        d[lend++] = c;
        c = getchar();
    }
    sort(d , d + lend);
	do
	{
		bool flag = true;
		for (int i = 0 ; i < lend - 1 ; ++i)
			if (d[i] == 'I' && alp[d[i]] < alp[d[i + 1]] && d[i + 1] != 'X' && d[i + 1] != 'V') {flag = false; break;}
		if (flag)
		{
			int num = 0;
            int i;
			for (i = 0 ; i < lend ; ++i)
            {
                if (i < lend - 1 && alp[d[i]] < alp[d[i + 1]] && (d[i] == 'I' || d[i] == 'X' || d[i] == 'C')) {num += alp[d[i + 1]] - alp[d[i]]; ++i;}
                else num += alp[d[i]];
            }
            //cout << num << endl;
            //for (int i = 0 ; i < lend ; i++) cout << d[i];
            //cout << endl;
			if (num <= minn) {minn = num; memcpy(ans , d , sizeof(d));}
		}
	}
	while (next_permutation(d , d + lend));
    for (int i = 0 ; i < lend ; i++)
        cout << ans[i];
	return 0;
}
2023/6/16 19:49
加载中...