题解:CF1955F Unfair Game
先找性质。
由于
然后又
然后考虑预处理,由于
那么设
然后询问的时候分别将
#include <bits/stdc++.h>
using namespace std;
int T;
int f[210][210][210];
int main() {
f[1][1][1] = 1;
for (int i = 0; i <= 200; ++i) {
for (int j = (i & 1); j <= 200; j += 2) {
for(int k = (j & 1); k <= 200; k += 2) {
if (i == 1 && j == 1 && k == 1) continue;
if (i == 0 && j == 0 && k == 0) continue;
if (i >= 2) f[i][j][k] = max(f[i][j][k], f[i - 2][j][k] + 1);
if (j >= 2) f[i][j][k] = max(f[i][j][k], f[i][j - 2][k] + 1);
if (k >= 2) f[i][j][k] = max(f[i][j][k], f[i][j][k - 2] + 1);
if (i >= 1 && j >= 1 && k >= 1) f[i][j][k] = max(f[i][j][k], f[i - 1][j - 1][k - 1] + 1);
}
}
}
scanf("%d", &T);
while (T--) {
int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d);
int ans = 0;
if (a - (a & 1) >= 0 && b - (b & 1) >= 0 && c - (c & 1) >= 0) ans = f[a - (a & 1)][b - (b & 1)][c - (c & 1)];
if (a - (!(a & 1)) >= 0 && b - (!(b & 1)) >= 0 && (c - (!(c & 1))) >= 0) ans = max(ans, f[a - (!(a & 1))][b - (!(b & 1))][(c - (!(c & 1)))]);
printf("%d\n", d / 2 + ans);
}
return 0;
}