Codeforces Round 960 (Div. 2)
1.Codeforces Round 958 (Div. 2)2.Codeforces Round 957 (Div. 3)3.Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)
4.Codeforces Round 960 (Div. 2)
5.AtCoder Beginner Contest 3636.Codeforces Round 961 (Div. 2)7.AtCoder Beginner Contest 3628.Codeforces Round 962 (Div. 3)9.Pinely Round 4 (Div. 1 + Div. 2)10.Educational Codeforces Round 168 (Rated for Div. 2)11.AtCoder Beginner Contest 36712.Codeforces Round 967 (Div. 2)13.Codeforces Round 968 (Div. 2)14.Educational Codeforces Round 173 (Rated for Div. 2)15.Educational Codeforces Round 172 (Rated for Div. 2)(C-D)16.Codeforces Round 998 (Div. 3)17.2025牛客寒假算法基础集训营218.2025牛客寒假算法基础集训营1题目链接:Codeforces Round 960 (Div. 2)
总结:Awa 2,Bwa 2,C一直wa。很难评价的一场。感觉D < C
A. Submission Bait
fag:博弈论
Description:给定
Solution:我们先考虑直接选最大值的情况,如果有奇数个最大值,那么先手赢。
- 考虑有偶数个最大值,怎么做?显然我们不能选最大值,考虑次大值有奇数个,那么先手赢。如果次大值也有偶数个,只能再往下考虑。
- 那么从最大次开始判断,只有有一个值有奇数个,那么先手赢,否则后手赢。
Competing: 第一发,只考虑了最大值的奇偶性;第二发,考虑了最大值的奇偶性和剩下所有数之和的奇偶性。
void solve(){ cin >> n; vector<int> a(n + 1); for (int i = 0; i < n; i ++){ int x; cin >> x; a[x] ++; } for (int i = n; i; i --){ if (a[i] & 1){ cout << "Yes\n"; return; } } cout << "No\n"; }
B. Array Craft
fag:构造
Description: 给定一个
Solution:先考虑
- 但是元素只能是
或 ,因此我们需要用 构造出 。构造时 之后应该紧跟 , 之前应该紧跟 。
Competing:令
void solve(){ int x, y; cin >> n >> x >> y; vector<int> a(n + 1, 1); for (int i = 1; i < y; i ++){ a[i] = -1; } for (int i = x + 1; i <= n; i ++) a[i] = -1; for (int i = y; i >= 0; i -= 2){ a[i] = 1; } for (int i = x; i <= n; i += 2) a[i] = 1; for (int i = 1; i <= n; i ++) cout << a[i] << " \n"[i == n]; }
C. Mad MAD Sum
fag: 思维?
Description:定义MAD为数组中至少出现两次的最大值。没有则为
。- 初始时,
,每回合 ; 数组更新为当前 数组的MAD,然后将 数组更新为 数组。
2 3 1 1 2 2 3 4 4 5 0 0 0 1 2 2 3 3 4 4 0 0 0 0 0 2 2 3 3 4 0 0 0 0 0 0 2 3 3 4 1 3 2 1 1 2 3 3 0 0 0 1 1 2 3 3 0 0 0 0 1 1 1 3
Solution:多模拟几组样例可以发现MAD数组一定是连续递增的。
- 我们可以观察到数组有右移的特征。
- 但是当MAD数组中出现一个数字时,下一轮它就会消失。因为MAD需要它至少出现两次。
- 因此我们第一轮得到一个MAD数组,然后再模拟一轮去掉单个数字,之后的每一轮都是向右移动一次。
Competing:只跑了一次就像得到答案,好像也是可以,但是比较麻烦。多模拟样例,注意特征,总结规律
void solve(){ cin >> n; vector<int> a(n), b(n); int ans = 0; map<int, int> mp; int mx = 0; for (int i = 0; i < n; i ++){ cin >> a[i]; ans += a[i]; mp[a[i]] ++; if (mp[a[i]] >= 2 && a[i] > mx){ mx = a[i]; } b[i] = mx; } mp.clear(); mx = 0; for (int i = 0; i < n; i ++){ ans += b[i]; mp[b[i]] ++; if (mp[b[i]] >= 2 && b[i] > mx) mx = b[i]; a[i] = mx; } for (int i = 0; i < n; i ++) ans += a[i] * (n - i); cout << ans << endl; }
D. Grid Puzzle
fag:思维
Description:有长度为
- 每次操作可以将一行染白,或者选一个
的矩阵染白。 - 求将棋盘染白的最少操作次数。
Solution:显然当
- 如果我们在这一行使用操作二,只会影响到下一行。
- 每一行我们最大执行一次操作二,否则不如使用操作一。
- 如果
,显然我们应该使用操作二,因为可以影响下一行。 - 假设当前行被上一行影响了,如果前两个格子被染白,并且
那么不需要执行操作;如果 ,如果前两个格子被(上一行)染白,我们需要使用操作二染白后两个格子。如果后两个格子被(上一行)染白,那么我们染白前两个格子;如果 ,我们使用操作一。 - 根据以上分析,注意到我们需要记录每一行被上一个影响的前两个格子还是后两个格子。
/* 4 2 4 4 2 3 */ void solve(){ cin >> n; vector<int> a(n + 1); vector<int> st(n + 1); cnt ++; int ans = 0; for (int i = 0; i < n; i ++){ cin >> a[i]; if (a[i] == 0){ continue; } if (a[i] <= 2){ if (st[i] == 1) continue; else{ ans ++; st[i + 1] = 1; } } else if (a[i] <= 4){ if (st[i] == 1){ ans ++; st[i + 1] = 2; } else if (st[i] == 2){ ans ++; st[i + 1] = 1; } else ans ++; } else{ ans ++; } } cout << ans << endl; }
合集:
题解
标签:
Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!