voidsolve() { int H, V; cin >> H >> V; int k; cin >> k; int x, y; cin >> x >> y; bool flag = true; for (int i = 0; i < k; i ++ ) { int a, b; cin >> a >> b; int dist = abs(a - x) + abs(b - y); if (dist % 2 == 0) flag = false; } if (!flag) cout << "NO" << endl; else cout << "YES" << endl; }
intmain() { int t; cin >> t; while (t -- ) { solve(); } }
voidsolve() { int n, k; cin >> n >> k; vector<vector<int>> location(k + 1); // 每个颜色所在位置 vector<vector<int>> dist(k + 1); // 每个颜色相隔距离 for (int i = 1; i <= k; i ++ ) location[i].push_back(0); for (int i = 1; i <= n; i ++ ) { int x; cin >> x; location[x].push_back(i); dist[x].push_back(i - 1 - location[x][location[x].size() - 2]); } for (int i = 1; i <= k; i ++ ) dist[i].push_back(n - location[i][location[i].size() - 1]); for (int i = 1; i <= k; i ++ ) sort(dist[i].begin(), dist[i].end(), greater<int>()); int minn = 0x3f3f3f; int color = 0; vector<int> res(k + 1); for (int i = 1; i <= k; i ++ ) res[i] = max(dist[i][0] / 2, dist[i][1]); for (int i = 1; i <= k; i ++ ) minn = min(minn, res[i]); cout << minn << endl; }
先处理陷入循环0、0、…的情况,如果末尾数字是5,直接先进行一轮操作1,让末尾变为0,之后全部进行操作2 然后处理陷入循环2、4、8、6、…的情况,记2 4 8 6为一次循环,设经过 x 次循环答案最大(每次循环可以让 s 增加 20),输出的答案则为ans = (s + 20 * x) * (k - 4 * x),整理后得到ans = -80 * x^2 + (20 * k - 4 * s) * x + s * k,转换成了求一元二次函数最大值的问题,直接求解即可
代码
#include<bits/stdc++.h>
usingnamespace std;
using i64 = longlong;
i64 cle(i64 n, i64 k) { i64 ans = n * k;
i64 a, b, c; // 系数 a = -80; b = 20 * k - 4 * n; c = n * k;
i64 x = -b / (2 * a); x = min(x, k / 4); // x不能大于 k / 4;
if (x > 0) ans = max(ans, a * x * x + b * x + c); // 因为x取了整数,所以x + 1和x - 1都检查一下 x = min(x + 1, k / 4); if (x > 0) ans = max(ans, a * x * x + b * x + c); x -= 2; if (x > 0) ans = max(ans, a * x * x + b * x + c); return ans; }
voidsolve() { i64 n, k; cin >> n >> k;
i64 ans = n * k;
if (n % 10 == 5) { n += 5; ans = max(ans, n * (k - 1)); } elseif (n % 10 > 0) { if (n % 2 != 0) { n += n % 10; k -- ; } for (int i = 0; i < 4; i ++ ) { ans = max(ans, cle(n, k)); k -- ; n += n % 10; } } cout << ans << endl; }