Codeforces Round 695 (Div. 2) A. Wizard of Orz

发布时间 2023-10-13 14:17:30作者: zsxuan

\(n\) 个数位板摆放成一条直线,每个数位板可以显示 \(0 \sim 9\) 的数字。最开始数位板显示的是 \(0\) 。每秒数位板上的数字都会加 \(1\)\(9\) 的下一个数字是 \(0\) 。当一个数位板被暂停,它上面的数字将会定格在当前秒。

你必须对某个数位板执行一次暂停,在任意可选的时刻。假设选择的位置是 \(x\) ,则位置 \(y\) 的数位板将会在第 \(|y - x|\) 秒后暂停。当所有数位板暂停后,\(n\) 个数位将从左到右按高位到低位构成一个数字。

询问最大可能得到的数字是多少?

假设对第 \(x\) 个数位板暂停,当前读数为 \(k\) 。则可以得到: \(\cdots,1,0,9,8,\cdots,k+1,k,k+1,\cdots,9,0,1,2,\cdots\)
观察图像,是根据 \(x\) 轴对称的一个函数,\(f(x) = k\)

显然当 \(ans\) 最大,\(a_1 = 9\)

  • 当在 \((2, 8)\) 暂停, \(a_2 = 8, a_3 = 9\)
  • 否则 \(a_2 =8, a_3 = 7\)

于是数字最大为 \(989012\cdots89012\cdots\)

view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	int n; std::cin >> n;
	int cur = 9;
	for (int i = 1; i <= n; i++) {
		if (i <= 2) std::cout << (10 - i);
		else {
			std::cout << cur;
			cur = (cur + 1) % 10;
		}
	}
	std::cout << "\n";
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}