定价 题解

思路

其实就是一道水题。
只要打出了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;
}
原文地址:https://www.cnblogs.com/cqbz-ChenJiage/p/14082423.html