题解:CF149B Martian Clock

Rex01

2025-01-09 22:07:51

Solution

CF149B 题目传送门

题目大意

给你一个 24 进制下的时间,若这个时间在 n 进制下,满足 24 进制的时间,则输出 n。如果没有,输出 0。如果有无穷个,则输出 −1

解决思路

分步走:

代码展示

#include <iostream>
#include <cmath>
using namespace std;

string s;
int l, z, z1, z2, hh[15], mm[15];
int cnt1, cnt2, f, h, m;
int Maxh = -1, Minh = 1e9 + 7;
int Maxm = -1, Minm = 1e9 + 7;
//定义一大堆变量爽了

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);//减少输入时间
    cin >> s;
    l = s.size();
    for(int i = 0; i < l; i++)
        if(s[i] == ':') z = i;//记录':'的位置
    for(int i = 0; i < z; i++)
    {
        if(s[i] != '0'){z1 = i; break;}
        if(i == z - 1) z1 = z - 1;
    }
    for(int i = z + 1; i < l; i++)
    {
        if(s[i] != '0'){z2 = i; break;}
        if(i == l - 1) z2 = l - 1;
    }
    for(int i = z1; i < z; i++)
        if(isdigit(s[i]))//isdigit(x)判断x是否为数字
        {
            int z = s[i] - '0';
            Maxh = max(Maxh, z);
            Minh = min(Minh, z);
            hh[++cnt1] = z;
        }
        else if('A' <= s[i] && s[i] <= 'Z')
        {
            int z = s[i] - 'A' + 10;
            Maxh = max(Maxh, z);
            Minh = min(Minh, z);
            hh[++cnt1] = z;
        }
    for(int i = z2; i < l; i++)
        if(isdigit(s[i]))
        {
            int z = s[i] - '0';
            Maxm = max(Maxm, z);
            Minm = min(Minm, z);
            mm[++cnt2] = z;
        }
        else if('A' <= s[i] && s[i] <= 'Z')
        {
            int z = s[i] - 'A' + 10;
            Maxm = max(Maxm, z);
            Minm = min(Minm, z);
            mm[++cnt2] = z;
        }
    if(Maxh > 23 || Maxm > 59)
    {//如果'时'最大超过23且'分'最大超过59
        cout << "0" << endl;
        return 0;//换行是个好习惯
    }
    if(cnt1 <= 1 && cnt2 <= 1)
    {
        cout << "-1" << endl;
        return 0;//好习惯 * 2
    }
    f = max(Maxh, Maxm) + 1;
    while(true)
    {
        int a = cnt1 - 1;
        h = 0; m = 0;//h表示小时,m表示分钟
        for(int i = 1; i <= cnt1; i++)
        {
            int z = pow(f, a);
            h += z * hh[i]; a--;
            //计算小时↑
        }
        a = cnt2 - 1;
        for(int i = 1; i <= cnt2;i++)
        {
            int z = pow(f, a);
            m += z * mm[i]; a--;
            //计算分钟↑
        }
        if((h < 0 || h > 23) || (m < 0 || m > 59))
        {//如果小时和分钟均不成立(我在说什么...)
            if(f == max(Maxh, Maxm) + 1)
                cout << "0" << endl;
            break;//不加这行将会喜提TLE
        }
        else cout << f << " ";//按题目格式输出
        f++;//别忘了每次输出完加1
    }   
    return 0;
}

温馨提示

不抄题解,从我做起!别跟我说你没看见或者不识字。