zoukankan      html  css  js  c++  java
  • HDU 1934 特殊数字

    有两种车牌号。让你判断第二种是不是在第一种之后且在第一种出Kth之前的车牌号。

    本解中是把前面的字母看成一位十进制的数。自己是一个26或者21进制的数。如果比较时有两种。那么第一种和第一种的最后一个比。第二种和第二种的第一种比。第一种的最后一个 和 第二种的第一个 相差1.。那么。两差相加再加1就是这两个数的差了。

    因为没有排除前一个是一种。后一个是第二种的情况RE了好久。

    感觉像一个模拟题、但是转换成数字那。又觉得很巧妙。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    using namespace std;
    
    char l1[] = {"ZZZ9999"};
    char l2[] = {"BBBBB00"};
    char temp[] = {"BDEFGHJKLNOQRSTUVWXYZ"};
    char error[] = {"ACMPI"};
    
    long long ask(char a[], char b[])  // 求两个数字只差。实际上只有两种。
    {
        long long sum = 0, suma = 0, sumb = 0;
        if (a[3]>='0' && a[3]<='9' && b[3]>='0' && b[3]<='9')
        {
            for (int i=0; i<3; ++i)
            {
                suma += (a[i]-'A')*pow(26, 2-i);
            }
            suma *= 10000;
            for (int i=3; i<7; ++i)
            {
                suma += (a[i]-'0')*pow(10, 6-i);
            }
            for (int i=0; i<3; ++i)
            {
                sumb += (b[i]-'A')*pow(26, 2-i);
            }
            sumb *= 10000;
            for (int i=3; i<7; ++i)
            {
                sumb += (b[i]-'0')*pow(10, 6-i);
            }
            sum = suma - sumb;    // 传参时 a[]是SM b[]是SI.
        }
        else if (a[3]>='A' && a[3]<='Z' && b[3]>='A' && b[3]<='Z')
        {
            for (int i=0; i<5; ++i)
            {
                int tempc = 1;
                for (int j=0; j<21; ++j)
                {
                    if (a[i] == temp[j])
                    {
                        tempc = j;
                        break;
                    }
                }
                suma += tempc*pow(21, 4-i);
            }
            suma *= 100;
            suma += (a[5]-'0')*10 + (a[6]-'0');
            for (int i=0; i<5; ++i)
            {
                int tempc = 1;
                for (int j=0; j<21; ++j)
                {
                    if (b[i] == temp[j])
                    {
                        tempc = j;
                        break;
                    }
                }
                sumb += tempc*pow(21, 4-i);
            }
            sumb *= 100;
            sumb += (b[5]-'0')*10 + (b[6]-'0');
            sum = suma - sumb;
        }
        else
        {
            suma = ask(a, l2);
            sumb = ask(l1, b);
            sum = suma + sumb + 1;
        }
        return sum;
    }
    
    int check(char s[])           // 判断第二个字符串是否合法
    {
        bool ok1 = true;
        bool ok2 = true;
        if (s[3]>='A' && s[3]<='Z')
        {
            for (int i=0; i<5; ++i)
            {
                if (s[i] == 'A' || s[i] == 'C' || s[i] == 'I' || s[i] == 'M' || s[i] == 'P')
                    return 0;
            }
        }
        for (int i=0; i<3; ++i)
        {
            if (s[i]<'A' || s[i]>'Z')
            {
               ok1 = false;
               break;
            }
        }
        for (int i=3; i<7; ++i)
        {
            if (s[i]<'0' || s[i]>'9')
            {
                ok1 = false;
                break;
            }
        }
        for (int i=0; i<5; ++i)
        {
            if (s[i]<'A' || s[i]>'Z')
            {
                ok2 = false;
                break;
            }
        }
        for (int i=5; i<7; ++i)
        {
            if (s[i]<'0' || s[i]>'9')
            {
                ok2 = false;
                break;
            }
        }
        if (ok1) return 1;
        if (ok2) return 2;
        return 0;
    }
    
    int main()
    {
        long long int c;
        char sm[10], si[10];
        while(cin >> sm >> si >> c)
        {
            if (sm[0] == '*' && si[0] == '*' && c == 0)
                break;
            if (!check(si))
            {
                cout << "N
    ";
                continue;
            }
            if (si[3] >= '0' && si[3] <= '9' && sm[3] >= 'A' && sm[3] <= 'Z')
            {
                cout << "N
    ";
                continue;
            }
            long long ans = ask(si, sm);
            if (ans>0 && ans<=c)
            {
                cout << "Y
    ";
            }
            else cout << "N
    ";
        }
        return 0;
    }
    View Code



  • 相关阅读:
    部署asp.net出现了问题
    给中国学生的第三封信[转载:李开复]
    给中国学生的第四封信:[转载:李开复]
    GMAIL DRIVE 提供邮箱一样大小的硬盘
    天气凉了,好舒服
    Asp.net与SQL一起打包部署安装
    无刷新联动下拉菜单(DotTextWeb版)
    我的主界面
    DataList绑定时控制字符串长度
    给中国学生的第一封信 [转载:李开复]
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4679749.html
Copyright © 2011-2022 走看看