AtCoder ABC161 D Lunlun Number

AtCoder ABC161 D Lunlun Number_第1张图片
AtCoder ABC161 D Lunlun Number_第2张图片

题意:

现给定 K K K ,求出所有 l u n l u n n u m b e r lunlun number lunlunnumber 中第 K K K 小的。

预处理打表。
预处理可以使用类似于 B f s Bfs Bfs 的方法实现。如果当前出队的数大于某个较大值时停止。实测“较大值”取 1011 1011 1011 时,共可以得到 3 × 1 0 5 3×10^5 3×105 个数以上,根据 K K K 的数据范围,可以符合要求。

AC代码:

vector<ll> ans;
ll Q[10000005];
int l = 1, r = 0;
void init()
{
	rep(i, 1, 9)
		Q[++r] = i;
	while (r > l)
	{
		ll cur = Q[l++];
		if (cur > 1e11)
			return;
		ans.pb(cur);
		int back = cur % 10;
		Q[++r] = cur * 10ll + back;
		if (back != 0)
			Q[++r] = cur * 10ll + back - 1;
		if (back != 9)
			Q[++r] = cur * 10ll + back + 1;
	}
}

int main()
{
	init();
	int k;
	sd(k);
	sort(ans.begin(), ans.end());
	pld(ans[k - 1]);
	return 0;
}

你可能感兴趣的:(AtCode)