voidsolve(){ int _; cin >> _; for (int ts = 0; ts < _; ++ts) { int n; cin >> n; int mi = INT_MAX, ma = INT_MIN; for (int i = 0; i < n; ++i) { int tmp; cin >> tmp; mi = min(mi, tmp); ma = max(ma, tmp); }
voidsolve(){ int _; cin >> _; for (int ts = 0; ts < _; ++ts) { int a, b, x; cin >> a >> b >> x; int ans = abs(a - b), cur = 0; while (a != b) { ++cur; if (a > b) a /= x; else b /= x; ans = min(ans, cur + abs(a - b)); }
cout << ans << endl; } }
D. Brand New Tatar TV Show
大致题意
有一个数组,接下来两个人需要进行博弈,每个人需要选择一个值拿走
如果为第一次取数,则可以随意选择
如果为非第一次取数,假定上次取走的为 $x$,那么这次只可以取走 $[x, x + k]$ 内的一个数值
谁无法取走数字谁失败。
要博弈的两个人(A,B),A 先行动,但是无论是 A 还是 B,都是希望 B 赢,请问是否存在可能让 B 赢
voidsolve(){ int _; cin >> _; for (int ts = 0; ts < _; ++ts) { int n; cin >> n; vector<int> v(n); for (int i = 0; i < n; ++i) cin >> v[i]; vector<vector<bool>> m; m.resize(n + 1); for (auto &item: m) item.resize(n + 1, false); int ans = 0; for (int i = 0; i < n; ++i) { vector<bool> flag(n + 1, false); int mi = v[i], ma = v[i]; for (int j = i; j < n; ++j) { if (flag[v[j]]) break; flag[v[j]] = true; mi = min(mi, v[j]); ma = max(ma, v[j]); if (ma - mi + 1 == j - i + 1) { m[mi][ma] = true; if (ma + 1 + ma - mi <= n && m[ma + 1][ma + 1 + ma - mi]) ans = max(ans, ma - mi + 1); if (mi - 1 - ma + mi >= 0 && m[mi - 1 - ma + mi][mi - 1]) ans = max(ans, ma - mi + 1); } } } cout << ans << endl; } }