441 字
2 分钟
2026 郑轻新生赛三带一题解

题意#

给定 1313 种类型的扑克牌数量,求最多能组合出多少个三带一(指 AAABAAAB 型)。

题解#

显然答案满足单调性,考虑如何 check

记 位置 ii33 使用了 xix_i 次,剩余了 si=ai3×xis_i = a_i - 3 \times x_i 张牌

答案为 ans=xians = \sum x_i ,一共剩余了 S=siS = \sum s_i

考虑配对的情况,使用 Hall 定理

对于位置 ii ,其 N({i})|N(\left\{ i \right\})| 显然为 SsiS - s_i

对于 多位置,其 N({i})N({j})=S\left| N(\left\{ i \right\}) \cap N(\left\{ j \right\}) \cap \cdots \right| = S

分别可得 xiSsix_i \leq S - s_ixiS\sum x_i \leq S

后者取最大转化为 xi=ans(ai3×xi)=ai3×ans\sum x_i = ans \leq (\sum a_i - 3 \times x_i) = \sum a_i - 3 \times ansansai4ans \leq \frac {\sum a_i} 4

前者转化为 xi(ai3×ans)(ai3×xi)x_i \leq (\sum a_i - 3 \times ans) - (a_i - 3 \times x_i)2×xi3×ans+aiai2 \times x_i \geq 3 \times ans + a_i - \sum a_i

又有限制条件 3×xiai3 \times x_i \leq a_i

综上可得 3×ans+aiai2xiai3\left \lceil {\frac {3 \times ans + a_i - \sum a_i} 2} \right \rceil \leq x_i \leq \left \lfloor {\frac {a_i} 3} \right \rfloor

检查 xi\sum x_i 范围内是否有 xx 即可

45 collapsed lines
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n = 13;
vector<int> a(n + 1);
int sum = 0;
for (int i = 0; i < n; i ++ ) {
cin >> a[i];
sum += a[i];
}
int l = 0, r = sum / 4;
auto check = [&](int x) {
int R = 0, L = 0;
for (int i = 0; i < n; i ++ ) {
int Y = a[i] / 3;
int X = max(0, (a[i] - sum + 3 * x));
X = (X + 1) / 2;
if (X > Y) return false;
R += Y;
L += X;
}
if (L <= x && x <= R) {
return true;
}
return false;
};
while (l < r) {
int mid = (l + r + 1) >> 1;
if (check(mid)) {
l = mid;
} else {
r = mid - 1;
}
}
cout << l << endl;
}
int main() {
int T = 1;
cin >> T;
while (T-- ) solve();
}
2026 郑轻新生赛三带一题解
https://dk-qwq.github.io/blog/posts/zzuli-2026-triple/
作者
dk-qwq
发布于
2026-03-17
许可协议
CC BY-NC-SA 4.0