AtCoder Beginner Contest 362
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 362
8.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题目链接:AtCoder Beginner Contest 362
A. Buy a Pen
tag:签到
B. Right Triangle
tag:模拟
C. Right Triangle
tag:贪心
Description:给定
Solution:先判断是否有解,令
- 先假设所有值都取最小值,则
,然后开始枚举当前位置的取值,看是否能令 ,否则当前值取最大值,继续向后枚举。
Competing:想到了如何判断是否有解,但是没想到贪心求解。
void solve(){ cin >> n; int mi = 0, ma = 0; vector<pii> a(n); for (int i = 0; i < n; i ++){ int l, r; cin >> l >> r; a[i] = {l, r}; mi += l; ma += r; } if (mi > 0 || ma < 0){ cout << "No\n"; } else{ cout << "Yes\n"; for (int i = 0; i < n; i ++){ // 刚开始假设所有值都取最小值 if (mi == 0){ for (int j = i; j < n; j ++){ cout << a[j].fi << " "; } return; } mi -= a[i].fi; // 开始选择第i个值 if (a[i].fi <= -mi && -mi <= a[i].se){ cout << -mi << " "; for (int j = i + 1; j < n; j ++){ cout << a[j].fi << " "; } return; } mi += a[i].se; cout << a[i].se << " "; } } }
D. Shortest Path 3
tag:Dijkstra
Description:给定一个图,每个点,边都有权值,求所有从起点
Solution:Dijkstra板子,将权值加上点的权值即可。
void solve(){ cin >> n >> m; vector g(n + 5, vector<pii>()); vector<int> dis(n + 5, 1e15), st(n + 5); vector<int> a(n + 5); for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 0; i < m; i ++){ int x, y, w; cin >> x >> y >> w; g[x].eb(w, y); g[y].eb(w, x); } auto dijkstra = [&](int u) -> void{ dis[u] = a[u]; priority_queue<pii, vector<pii>, greater<pii>> qu; qu.ep(dis[u], u); while (qu.size()){ auto [w, y] = qu.top(); qu.pop(); if (st[y]) continue; st[y] = true; for (auto [ww, yy] : g[y]){ if (a[yy] + ww + w < dis[yy]){ dis[yy] = ww + w + a[yy]; qu.ep(dis[yy], yy); } } } }; dijkstra(1); for (int i = 2; i <= n; i ++){ cout << dis[i] << " "; } }
E. Count Arithmetic Subsequences
tag: dp
Description:给定一个数组a.size() <= 80
。
Solution:因为
-
状态表示:显然需要有长度和公差,然后需要一个位置。所有我们使用
,表示终点为 ,长度为 ,公差为 的所有等差数列的集合。 -
状态转移:
。 -
初始化:初始化长度为
的所有答案;注意到公差的范围很大,我们使用 进行离散化。
int dp[100][100][6500]; map<int, int> d; void solve(){ cin >> n; vector<int> a(n); int cnt = 1; for (int i = 0; i < n; i ++) cin >> a[i]; for (int i = 0; i < n; i ++) for (int j = 0; j < n; j ++){ if (!d[a[i] - a[j]]) d[a[i] - a[j]] = cnt ++; // 离散化 } for (int i = 0; i < n; i ++){ for (int j = 0; j < i; j ++){ dp[i][2][d[a[i] - a[j]]] ++; // 初始化长度为2的 } for (int j = 0; j < i; j ++) for (int k = 3; k <= i + 1; k ++){ dp[i][k][d[a[i] - a[j]]] += dp[j][k - 1][d[a[i] - a[j]]]; dp[i][k][d[a[i] - a[j]]] %= mod; } } for (int k = 1; k <= n; k++){ if (k == 1){ cout << n << " "; continue; } int ans = 0; for (int i = 0; i < n; i++){ for (int j = 1; j <= cnt; j++){ ans += dp[i][k][j]; ans %= mod; } } cout << ans << ' '; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战