题解 CF662D 【International Olympiad】

rui_er

2020-09-06 22:51:05

Solution

题意简述:IAO 比赛从 $1989$ 年开始举办,每一年都有一个数字缩写。前面的年份用过的缩写在后面不能再用,每次的缩写的长度尽量短。问一些缩写是哪些年份的缩写。 --- 思路: 我的思路与 CF 官方题解的思路差不多,获取完数字后,每次加上最小的满足缩写的 $10$ 的整数次幂(根据数字长度计算),直到与缩写匹配成功。 于是便有了第一份代码的读入和获取长度部分: ```cpp while(getchar() != '\''); scanf("%d", &n); int _ = n, len = 0; while(_) ++len, _ /= 10; ``` 自豪的说:我想到了一个别人都没想到的方法!(滑稽) 然后就成功的 Wrong Answer On Test 4 了…… 只好重看代码,仔细检查了一下其他地方都没有错误,最大的可能就是输入这里错了。然后增加一处调试,把 $len$ 的值输出出来,发现遇到 $0$ 就可能出问题。对照了一下其他题解,最终找到了一个坑点——**考虑前导零**! 前导零也会影响缩写,但是按照我的方法,会直接将前导零忽略,给出小得多的答案。 于是尝试将输入部分改为: ```cpp while(getchar() != '\''); scanf("%s", s); n = atoi(s); int _ = 0, len = strlen(s); ``` 自测正确,提交 Accepted。 --- 代码: ```cpp //By: Luogu@rui_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; } ```