Link
思路
其实就是一道水题。
只要打出了T 20pts的代码,那么你离AC就相差无几了。
其实可以发现如果你在算了100之后并不需要去算101~999。
那么可以直接人口普查,跑一遍,每次在循环(i++)时改成(i+=add)即可。
至于(add)就是一眼的事情了。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int Add[15] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int t, l, r;
int change(int num) {
while (num % 10 == 0) {
num /= 10;
}
int power = 1;
int len = 0;
for (int i = 1; i <= 9; i++) {
power *= 10;
if (power >= num) {
len = i;
break;
}
}
int last = num % 10;
if (last == 5) {
return len * 2 - 1;
} else return len * 2;
}
int add(int x) {
int tot = 0;
while (x % 10 == 0) {
x /= 10;
tot++;
}
return tot;
}
int main() {
scanf ("%d", &t);
while (t--) {
scanf ("%d %d", &l, &r);
int ans = 50;
int num;
for (int i = l; i <= r; i += Add[add(i)]) {
if (change(i) < ans) {
ans = change(i);
num = i;
}
}
printf ("%d
", num);
}
return 0;
}