#140-(EZOI练习)[进制转换]汽车牌照

版权声明:反正也没有人会转,下一个 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;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/83310701