题解 CF662D 【International Olympiad】
rui_er
2020-09-06 22:51:05
题意简述: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;
}
```