可得国际教育资讯
Insight · 通用资讯USACO

USACO 2026 第二场 AK !题目越来越难?(附全组别题解)

可得未来

USACO 2026 第二场 AK !题目越来越难?(附全组别题解)

IMG_257

USACO 2026 第二场月赛落下帷幕,最直观的感受就是:算法竞赛的“红利期”正在消失,题目的综合性显著增强。

IMG_258

(图源来自:https://usaco.org)

即便对于有基础的同学,这次的银组第一题也成了不少人的“滑铁卢”,逻辑陷阱极多。经过复盘,可得君已为大家已经整理出了从铜组到金组的全套题解!

本文预计浏览时间5分钟,可根据小标题跳跃浏览。

1.铜组题目解析

2.银组题目解析

3.金组题目解析

铜组题目解析

Q1:It's Mooin' Time IV

1题目描述

IMG_259IMG_260

2

题目理解

IMG_261

3

关键思路

IMG_262IMG_263IMG_264IMG_265IMG_266IMG_267

左右滑动查看完整思路

4

代码实现

C++代码参考1

cpp9
#include<iostream>#include<string>usingnamespacestd;
charflipChar(char c){ return (c == 'M') ? 'O' : 'M';}
intmain(){ int T, k; cin >> T >> k;
for (int tc = 0; tc < T; tc++) { int N; string S; cin >> N >> S;
cout << "YES ";
if (k == 1) { stringanswer(N, ' '); int flipFlag = 0;
for (int i = N - 1; i >= 0; i--) { char visibleChar = S[i]; if (flipFlag == 1) visibleChar = flipChar(visibleChar);
if (visibleChar == 'M') { answer[i] = 'M'; } else { answer[i] = 'O'; flipFlag = 1 - flipFlag; } }
cout << answer << " "; } } return0;}


C++代码参考2

cpp11
#include<bits/stdc++.h>usingnamespacestd;
staticcharflipChar(char c){return (c == 'M') ? 'O' : 'M';}
intmain(){ ios::sync_with_stdio(false);cin.tie(nullptr);
int T, k;cin >> T >> k;
for (int tc = 0; tc < T; tc++) {int N;string S;cin >> N >> S;
cout << "YES ";
if (k == 1) {int r = N - 1; // pointer from right to leftint flipFlag = 0; // 0 = normal view, 1 = flipped viewstring reversedKeys; reversedKeys.reserve(N);
while (r >= 0) {char visible = S[r];if (flipFlag == 1) visible = flipChar(visible);
if (visible == 'M') { reversedKeys.push_back('M'); r--; } else { reversedKeys.push_back('O'); r--; flipFlag = 1 - flipFlag; } }
// reverse to get the forward keystroke sequence reverse(reversedKeys.begin(), reversedKeys.end());cout << reversedKeys << " "; } }
return0;}


Q2:Moo Hunt

1

题目描述

IMG_268IMG_269

2

题目理解

IMG_270

3

关键思路

IMG_271IMG_272IMG_273IMG_274IMG_275IMG_276IMG_277IMG_278IMG_279

左右滑动查看完整思路

4

代码实现

C++代码参考

cpp11
def solve(): N, K = map(int, input().split())
size = 2 ** N pow2 = [1] * Nfor i in range(1, N): pow2[i] = pow2[i - 1] * 2
# coef[code]:对集合 code 的系数(记账表) coef = [0] * size
for _ in range(K): x, y, z = map(int, input().split()) # 转成 0-index x -= 1 y -= 1 z -= 1
cx = pow2[x] cy = pow2[y] cz = pow2[z]
coef[cx] += 1 coef[cx + cy] -= 1 coef[cx + cz] -= 1 coef[cx + cy + cz] += 1
# score 最终会变成每个棋盘的总得分 score = coef[:]
# N 轮累计:把“所有子集合的 coef 之和”算出来for i in range(N): step = pow2[i]for code in range(size): # 判断 code 的集合里是否包含第 i 格:# 也就是 code 在第 i 位上的“数字”是不是 1if (code // step) % 2 == 1: score[code] += score[code - step]
best = None count = 0for val in score:if best is None or val > best: best = val count = 1 elif val == best: count += 1
print(best, count)
if __name__ == "__main__": solve()


Q3:Purchasing Milk

1

题目描述

IMG_280

2

题目理解

IMG_281

3

关键思路

IMG_282IMG_283IMG_284IMG_285

左右滑动查看完整思路

4

代码实现

C++代码参考

cpp2
#include<iostream>#include<vector>#include<algorithm>#include<limits>usingnamespacestd;intmain()
#include<iostream>#include<vector>#include<algorithm>#include<limits>usingnamespacestd;intmain(){ int N, Q; cin >> N >> Q; // Because x <= 1e9, we only need deal sizes up to 2^30 (31 deals: 2^0 ... 2^30). int M = min(N, 31); vector<longlong> cost(M); for (int i = 0; i < N; i++) { longlong a; cin >> a; if (i < M) { cost[i] = a; } } // Precompute sizes: size[i] = 2^i, without using bitwise operators. vector<longlong> size(M); size[0] = 1; for (int i = 1; i < M; i++) { size[i] = size[i - 1] * 2; }// Normalize costs: cost[i] should not be more than 2 * cost[i-1] for (int i = 1; i < M; i++) { longlong two_smaller = cost[i - 1] * 2; if (cost[i] > two_smaller) { cost[i] = two_smaller; } } // A large "infinity" value (no bitwise ops). longlong INF = numeric_limits<longlong>::max() / 4; while (Q--) { longlong x; cin >> x; longlong remaining = x; longlong cost_so_far = 0; longlong best = INF; // Go from largest pack to smallest pack for (int i = M - 1; i >= 0; i--) { longlong pack_size = size[i]; // Take as many of this pack as possible without exceeding remaining longlong take = remaining / pack_size; cost_so_far = cost_so_far + take * cost[i]; remaining = remaining - take * pack_size;// Candidate answer: finish now.// If we still need buckets, one extra pack of this size can cover the rest (overshoot allowed). longlong candidate = cost_so_far; if (remaining > 0) { candidate = candidate + cost[i]; } if (candidate < best) { best = candidate; } } cout << best << " "; } return0;}


银组题目解析

Q1:COW-LIBI 2

1

题目描述

IMG_286IMG_287IMG_288

2

题目理解

IMG_289

3

关键思路

IMG_290IMG_291

左右滑动查看完整思路

4

代码实现

IMG_293IMG_294

Q2:Declining Invitations

1

题目描述

IMG_295

2

题目理解

IMG_296

3

关键思路

IMG_297IMG_298IMG_299IMG_300

左右滑动查看完整思路

4

代码实现

IMG_302IMG_303IMG_304

左右滑动查看完整思路

IMG_307IMG_308

Q3:FARMER JOHN LOVES ROTATIONS

1

题目描述

IMG_309

2

题目理解

IMG_310

3

关键思路

IMG_311IMG_312IMG_313IMG_314IMG_315IMG_316

左右滑动查看完整思路

4

代码实现

IMG_317

💬 想看完整代码和避坑指南的家长,欢迎私信添加【可得君】获取!

需要获取完整代码和更高效的算法实现? 请长按识别二维码或私信【可得君】👇

END

以上就是本期内容啦,欢迎学生和家长朋友们点赞留言,如果觉得内容有帮助请帮可得君点个在看呀~

为了帮助大家更好地参加比赛,可得给大家准备了可得独家USACO完整参赛指南附录,需要的可以添加可得君微信(V:CodingniniF)免费领取~


IMG_326