## 赌局 #背包dp #容斥 #贪心 如果我们已经选择了一种方案(以下 $a,b$ 表示已选的),那么我们可以枚举最终是哪个人赢了,赌除了这个人以外的人的就要给你钱,赌了这个人的你就要给他钱,因此最坏情况下收益为 $ \min\limits_{i\in [1,3]}\left(\underbrace{\sum\limits_{j\ne i}b_j}_\text{输的人给你的}-\underbrace{\sum a_i}_\text{赢的人你给的}\right) $ 很显然 $j\ne i$ 求和那里不好处理,但是我们可以做容斥,用所有 $b$ 的和减去 $\sum b_i$,因此问题变成 $ \min\limits_{i\in [1,3]}\left(\sum b-\sum b_i-{\sum a_i}\right)=\min\limits_{i\in [1,3]}\left(\sum b-\sum(a_i+b_i)\right) $ 而已选的 $b$ 的和在统计答案时其实是常数,因此我们需要最大化 $\sum(a_i+b_i)$,即求 $ \sum b-\max_{i\in[1,3]}\sum(a_i+b_i) $ 但是这个 $\max$ 很难处理,因为我们并不清楚三个当中的哪一个才是 $\max$。而我们选择一个新的元素时,可能会改变 ${} \max\sum(a_i+b_i) {}$,也会导致 $\sum b$ 变化,这个变化是很难维护的。 因此我们需要将 $\max\sum(a_i+b_i)$ 作为限制,也就是限制三组当中的任何一组都要满足 $\sum(a_i+b_i)$ 不超过这个值,而在满足条件的情况下最大化 $\sum b$。 于是我们可以对每一组做 0/1 背包。将 $a_i+b_i$ 视为重量,$b_i$ 视为价值,这样子我们就可以得到在重量不超过一定值的情况下,价值的最大值,也就是上式的要求。 因此思路就很清晰了。 1. 对每一组做以 $a_i+b_i$ 为重量,$b_i$ 为价值的 0/1 背包; 2. 对背包做前缀 $\max$,得到重量不超过限制的最大价值(如果 dp 数组全初始化为 $0$ 就可以省略这一步); 3. 枚举 $\sum(a_i+b_i)$ 的最大值,在每一组都不超过这个限制的情况下计算最大 $b_i$ 和。 时间复杂度 $\mathcal O(n\times nV)$。 ```cpp #include <iostream> #include <vector> using namespace std; using LL = long long; const LL kMaxN = 505 * 505 + 5; struct Node { LL a, b; }; LL dp[4][kMaxN], n, ans; vector<Node> v[4], itm; // 01 背包 void solve(LL dp[kMaxN], const vector<Node> &itm) { for (auto i : itm) { for (LL j = kMaxN - 1; j >= i.a; j--) { dp[j] = max(dp[j], dp[j - i.a] + i.b); } } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for (LL i = 1, t, a, b; i <= n; i++) { cin >> t >> a >> b; v[t].push_back(Node{a, b}); } for (LL i = 1; i <= 3; i++) { itm.clear(); // 按照上述方式构建背包元素 for (auto j : v[i]) { itm.push_back(Node{j.a + j.b, j.b}); } solve(dp[i], itm); } for (LL i = 0; i < kMaxN; i++) { // 枚举 sum(a[i]+b[i]) 的最大值 LL sum = 0; for (LL j = 1; j <= 3; j++) { // 枚举分组 sum += dp[j][i]; // 在 sum(a[i]+b[i]) 不超过最大值的情况下求 b[i] 最大和 } ans = max(ans, sum - i); // 注意这里和式子一样要减最大值 } cout << ans << '\n'; return 0; } ``` ## 三元组 写了个 $\mathcal O(n^2)$ 的暴力,光荣获得 $10$ 分。 ## 游戏 啥都没写。 ## 连通性统计 啥都没写。 ## 总结 总分:$100+10=110$。 花了两个多小时写了 T1,然后 T2 没怎么想就只写了暴力,后两题根本没动。还是相较于上次有进步,至少成功地写出了 T1 捍卫了最后的尊严,但是后面去写美丽的 CCH 题单了就没做了,其实还可以骗得更多分数。T2 正解好像也不是很复杂,等会看看。