版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/83310701
Description
小 Y 最近发现街上的汽车越来越多了,作为汽车的重要标志——汽车牌照也是越来越不够用了,已经从以前的十进制发展到三十六进制了,以前的一个汽车牌照“苏 D88888”,现在的牌照“苏 D0YY11”。
小 Y 突发其想,想知道他看到的大量汽车牌照中最近的两个汽车牌照相差多少?
Input
若干行(不超过 500000 行),每行为一个汽车牌照。
每个汽车牌照为一个 7 位的字符串,格式为 SD×××××,其中一个 × 表示一个 0~9 或A~Z,所涉及的字母均为大写。
Output
一行一个数,表示最接近的两个汽车牌照之间的差值,要求为十进制数。
Sample Input
SD12345
SD88888
SD22222
SD99999
Sample Output
1678245
直接进制转换
#include <iostream>
#include <algorithm>
#define SIZE 500010
using namespace std;
long long a[SIZE];
bool flag = true;
long long read(void) // 这里就包括在快读里面
{
long long x = 0;
char c = getchar();
if (c == -1)
{
flag = false;
return -1;
}
while (c != 'S') // 每个车牌号的起始符'S'
{
c = getchar();
if (c == -1)
{
flag = false;
return -1;
}
}
if (getchar() == -1) // 把B冲掉
{
flag = false;
return -1;
}
c = getchar();
while (((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z'))) // 这里也是快读的思想
{
if (c == -1) // 时刻防止EOF
{
flag = false;
return -1;
}
if ((c >= '0') && (c <= '9')) // 0 - 9
{
x = x * 36 + c - '0';
}
else
{
x = x * 36 + c + 10 - 'A'; // 10 - 35
}
c = getchar();
}
if (c == -1)
{
flag = false;
return -1;
}
return x;
}
int main(void)
{
long long res;
int n = 0, i;
while (flag)
{
a[++n] = read(); // 读入
}
--n;
sort(a + 1, a + n + 1);
res = a[2] - a[1];
for (i = 2; i < n; ++i) // 数据范围太大,必须要排序完用O(n)算法
{
res = min(res, a[i+1] - a[i]);
}
printf("%lld", res);
return 0;
}