有两种车牌号。让你判断第二种是不是在第一种之后且在第一种出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; }