题解 [email protected]洛谷 | [email protected] 【International Olympiad】

题意简述:IAO 比赛从 19891989 年开始举办,每一年都有一个数字缩写。前面的年份用过的缩写在后面不能再用,每次的缩写的长度尽量短。问一些缩写是哪些年份的缩写。


思路:

我的思路与 CF 官方题解的思路差不多,获取完数字后,每次加上最小的满足缩写的 1010 的整数次幂(根据数字长度计算),直到与缩写匹配成功。

于是便有了第一份代码的读入和获取长度部分:

while(getchar() != '\'');
scanf("%d", &n);
int _ = n, len = 0;
while(_) ++len, _ /= 10;

自豪的说:我想到了一个别人都没想到的方法!(滑稽)

然后就成功的 Wrong Answer On Test 4 了……

只好重看代码,仔细检查了一下其他地方都没有错误,最大的可能就是输入这里错了。然后增加一处调试,把 lenlen 的值输出出来,发现遇到 00 就可能出问题。对照了一下其他题解,最终找到了一个坑点——考虑前导零

前导零也会影响缩写,但是按照我的方法,会直接将前导零忽略,给出小得多的答案。

于是尝试将输入部分改为:

while(getchar() != '\'');
scanf("%s", s);
n = atoi(s);
int _ = 0, len = strlen(s);

自测正确,提交 Accepted。


代码:

//By: [email protected]_er(122461)
#include <bits/stdc++.h>
using namespace std;

int T, n; 
char s[11];

int main() {
	scanf("%d", &T);
	while(T--) {
		while(getchar() != '\'');
		scanf("%s", s);
		n = atoi(s);
		int _ = 0, len = strlen(s);
		int _10 = 1;
		for(int i=1;i<len;i++) _ += (_10 *= 10);
		_10 *= 10;
		while(n < 1989 + _) n += _10;
		printf("%d\n", n);
	}
	return 0;
}