选拔赛题解

news/2025/11/16 18:16:25/文章来源:https://www.cnblogs.com/Zvelig1205/p/19197946

神秘花

变种 \(01\) 背包,原题链接。

回忆普通的 \(01\) 背包,\(dp[j]\) 代表容量为 \(j\) 时所能得到的最大价值,这样操作的时间复杂度为 \(O(nV)\)(其中 \(n\) 代表物品数量,\(V\) 代表容量)。

但是在本题中,\(V\) 的范围是 \(10^9\)

观察发现,本题中的价值 \(k_i\) 较小,\(O(n\cdot \sum k_i)=O(n^2\cdot \max {(k_i)})\),这样的复杂度可以接受。

所以考虑更换 \(dp\) 状态,用 \(dp[j]\) 来表示价值达到 \(j\) 时所需要的最小容量。

状态转移方程即为:\(dp_j = \min(dp_j, dp_{j - k_i} + v_i)\)

最后从大到小遍历,找到最大的 \(dp_i \le V\)\(i\) 即为最终答案。

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1e5 + 7;
int n, V, sum;
int v[107], k[107];
i64 dp[N];
int main()
{cin >> n >> V;for (int i = 1; i <= n; i++){cin >> v[i] >> k[i];sum += k[i];}memset(dp, 0x7f, sizeof(dp));dp[0] = 0;for (int i = 1; i <= n; i++){for (int j = sum; j >= k[i]; j--){dp[j] = min(dp[j], dp[j - k[i]] + v[i]);}}for (int i = sum; i > 0; i--){if (dp[i] <= V){cout << i << '\n';return 0;}}return 0;
}

该题一共可以分为

  1. 图的建立与存储

    邻接表(链式前向星)和 \(vector\) 均可,此处使用 \(vector\)

  2. 树的深度和宽度统计

    通过一遍 \(dfs\) 即可统计每个点的深度,同时统计每种深度的个数,即可求出树的深度和宽度。

  3. 树上距离的统计

    树上距离可以先求出两点之间的 \(lca\) 后,然后便可直接通过深度差求出距离。

什么?你不会求 \(lca\)

罚你去看 Zvelig 的博客

这个题数据范围很小,可以直接暴力求。

什么?你不知道什么是 \(lca\)

罚你去看 Zvelig 的博客

好的你应该看完了。

记录每个结点的父结点,当结点 \(x\) 与结点 \(y\) 深度不同时,我们选择较深的结点去寻找其父结点,直到结点的深度相同。此时若两结点已经相同,则说明已经找到 \(lca\);否则两个结点同时寻找各自的父结点,直到两结点相同,此时即找到 \(lca\)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 7;
vector<int> e[N];
int fa[N], dep[N], bre[N];
int maxd, maxb;
void dfs(int now)
{dep[now] = dep[fa[now]] + 1;maxd = max(maxd, dep[now]);bre[dep[now]]++;maxb = max(maxb, bre[dep[now]]);for (auto p : e[now])dfs(p);
}
int lca(int x, int y)
{if (dep[x] < dep[y])swap(x, y);while (dep[x] > dep[y])x = fa[x];if (x == y)return x;while (x != y)x = fa[x], y = fa[y];return x;
}int n, m;
void _()
{cin >> n;for (int i = 1; i < n; i++){int u, v;cin >> u >> v;fa[v] = u;e[u].push_back(v);}dfs(1);cout << maxd << '\n';cout << maxb << '\n';cin >> m;for (int i = 1; i <= m; i++){int x, y;cin >> x >> y;int l = lca(x, y);cout << (dep[x] - dep[l]) * 2 + (dep[y] - dep[l]) << '\n';}
}
signed main()
{int qwq = 1;// cin >> qwq;while (qwq--)_();return 0;
}

当你看懂了这个代码,就可以考虑对于数据范围为 \(n=10^5\) 时应该如何解决该问题。

去看 Zvelig 的博客就会了

学习一下倍增就可以了,其他的不用管。

黄教的题

总有人与我不期而遇在迷茫的路口

观察到数据范围很小,只有 \(1 \le |s| \le 3000 , \sum|s| \le 3000\),所以 \(O(n^2)\) 的复杂度可以接受。

只需要枚举长度 \(len\),然后判断当前 \(len\) 的前后缀是否相同(即是否为 border)即可。

注意枚举时要保证 \(<len\) 而非 \(\le len\)

#include <bits/stdc++.h>
using namespace std;
void _()
{string s;cin >> s;int len = s.size(), ans = 0;for (int i = 1; i < len; i++){bool pd = 1;for (int l = 0, r = len - i; l < i; l++, r++){if (s[l] != s[r]){pd = 0;break;}}if (pd){ans = max(ans, i);}}cout << ans << '\n';
}
signed main()
{int qwq = 1;cin >> qwq;while (qwq--)_();return 0;
}

当数据范围扩大到 \(10^5- 10^6\) 时,则需要考虑字符串哈希或 KMP 算法。

为我再次寻回遗失在现实角落的梦

贪心的将最大的 \(k\) 个或者最小的 \(k\) 个放到第一组,剩下的放到第二组。

所以 sort 之后求前缀和,然后每次计算两种情况中两组的差即可。

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
void _()
{int n, q;cin >> n >> q;vector<i64> a(n + 7), sum(n + 7);for (int i = 1; i <= n; i++)cin >> a[i];sort(a.begin() + 1, a.begin() + n + 1);for (int i = 1; i <= n; i++)sum[i] = sum[i - 1] + a[i];while (q--){int k;cin >> k;cout << max((sum[n] - sum[k]) - sum[k], (sum[n] - sum[n - k]) - sum[n - k]) << endl;}
}
signed main()
{// ios::sync_with_stdio(0);// cin.tie(0), cout.tie(0);int qwq = 1;while (qwq--)_();return 0;
}

\(I/O\) 量较大,如超时可考虑关流。

记得使用 long long

Whizney 的题

Whizneyの小小游戏!

一个很有意思的递推题,也可以是找规律题。

\(f_i\) 来代表产生一个 \(2^i\) 块时会得到的得分。

首先分析初始条件:块 \(2\) 不会产生任何得分,块 \(2^2=4\) 会获得 \(4\) 点得分。

然后,当产生块 \(2^i(i>2)\) 时,此时已经有了两个 \(2^{i-1}\) 块的得分,新块的得分为 \(2^i\)

所以就有递推公式:\(f_i=f_{i-1} * 2 +2^i\),进一步分析可得 \(f_i=(i-1)\times 2^i\)(数学归纳法可证明)。

最后通过最终得分便可分析每个块的数量。

从大到小枚举每个块,然后判断当前得分下,该块能有几个,并计算除去该块后的得分。

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
struct node
{i64 val;int num;node() {}node(i64 val, int num) : val(val), num(num) {}
};
void _()
{int n, cnt;cin >> n;vector<i64> a(n + 7);i64 maxn = 0;for (int i = 1; i <= n; i++){cin >> a[i];maxn = max(maxn, a[i]);}vector<i64> f(107);f[2] = 4;for (int i = 3; i <= maxn; i++){f[i] = f[i - 1] * 2ll + (1ll << i);cnt = i;if (f[i] > maxn)break;}for (int i = 1; i <= n; i++){vector<node> ans;for (int j = cnt; j > 1; j--){int k = a[i] / f[j];a[i] %= f[j];ans.push_back(node(1ll << j, k));}if (a[i]){puts("miao?");continue;}for (auto i : ans){if (i.num)cout << i.val << ' ' << i.num << '\n';}}
}
signed main()
{int qwq = 1;while (qwq--)_();return 0;
}

小鸟公主の新冒险!

Floyd 经典板子题,建议搜索关键字自行学习

--Whizney

Floyd 本质上是一种 dp 思想,可以处理很多二元组的关系。

本题中注意处理重边和自环即可。

以及边权较大,记得开 long long

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const i64 inf = 1e12 + 7;
void _()
{int n, m;cin >> n >> m;vector<vector<i64>> dis(n + 7, vector<i64>(n + 7, inf));for (int i = 1; i <= m; i++){int u, v;i64 w;cin >> u >> v >> w;dis[u][v] = min(dis[u][v], w);dis[v][u] = min(dis[v][u], w);}for (int i = 1; i <= n; i++)dis[i][i] = 0;for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);int q;cin >> q;while (q--){int u, v;cin >> u >> v;if (dis[u][v] == inf)cout << "404 NOT FOUND" << '\n';elsecout << dis[u][v] << '\n';}
}
signed main()
{int qwq = 1;while (qwq--)_();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 中的 **普通筛、埃氏筛、线性筛**,它们都是求质数或判断质数的方法

普通筛、埃氏筛、线性筛,它们都是求质数或判断质数的方法,但原理和复杂度不同。 1️⃣ 普通筛(暴力判断质数) 思路:对每个数 i(2 ≤ i ≤ n),判断它是否能被小于它的数整除。 如果不能整除,则 i 是质数。复杂…

Linux - sudo -i

Linux - sudo -i在 Linux 中,sudo -i 的作用是 启动一个模拟 root 用户登录的环境(login shell),让你进入一个“像是用 root 登录系统一样”的 Shell。 下面是重点解释:✅ sudo -i 做了什么? 当你执行:sudo -i …

利用单片机的TIM模块播放春日影

利用TIM模块演奏音乐 大致思路利用一个定时器输出PWM波控制蜂鸣器音调,另一个定时器模块控制播放的节奏准备部分 设计电路 准备材料导线若干,稳压二极管,无源蜂鸣器设计电路图将蜂鸣器按照极性接分别接在信号源和接…

warp-cli代理

curl https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpgecho "deb [arch=amd64 signed-by=/usr/share/keyrings/clou…

完整教程:Rust语言特性深度解析:所有权、生命周期与模式匹配之我见

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【2025-11-14】工作压力

20:00一个经受过种种磨难的人在多年以后回想起这些遭遇时,甚至会感到一种乐趣。——[古希腊]荷马《奥德赛》昨晚发现家里已经没有备用洗发水了,何太说要用她快过期的一千块福利积分购买。当我听到“快过期的一千块积…

20232401 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20232401 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1.实验内容1.1 DNS查询获取相关信息 1.2 实际场景获得通信对方的IP并获取地理位置 1.3 nmap扫描靶机获取信息 1.4 Nessus扫描靶机获取信息并尝试利用漏洞 …

do文件仿真 fpga

do文件仿真 fpga 原文连接: https://www.bilibili.com/video/BV1DY411B7aV/?spm_id_from=333.337.search-card.all.click&vd_source=ac9167e61e0c909658ec9e3b6350cd4e

20232412 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 实验要求 (1)选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式、该域名对应IP地址、IP地址注册人及联系方式、IP地址所在国家、城市和具体地理位置。 PS:使用whois、dig、nslookup、tracero…

本地缓存Caffeien

为什么用本地缓存 低延迟高吞吐:本地缓存直接存储在JVM堆内存中,读写操作无需网络传输,延迟可低至纳秒级,显著优于Redis等分布式缓存的毫秒级响应 。降低Redis压力:在多级缓存架构中,本地缓存作为第一层缓存,可…

实用指南:C++---嵌套类型(Nested Types)封装与泛型的基石

实用指南:C++---嵌套类型(Nested Types)封装与泛型的基石2025-11-16 17:51 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

[ sqlite ]

# 查看所有的表 .tables.schema <tabale name># 打开数据库后先切好显示模式 .headers on .mode column # 查看表结构与列名 .schema ZBILLENTITY PRAGMA table_info(ZBILLENTITY);

视野修炼-技术周刊第127期 | Valdi

① tasuku - 极简 Node 任务处理 ② fkill - 强制终止进程 ③ FileMock ④ Valdi - 新的跨平台 UI 框架 ⑤ JavaScript 引擎大全 ⑥ 使用 Error.cause 进行错误处理 ⑦ GitHub Repo Visibility Analyzer欢迎来到第 127…

完整教程:机器学习:基于大数据的基金数据分析可视化系统 股票数据 金融数据 股价 Django框架 大数据技术(源码) ✅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

科学计算复习

Scientific Computing Review Outline Author: Hu Si Date: 2025-11-16 Floating-Point Number SystemExample Problem 1.3 Let ( x_f ) and ( y_f ) be adjacent floating-point numbers (positive normal floats). W…

【AIGC】语音识别ASR:火山引擎大模型技术实践 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月石笼网厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!

在水利防护、交通建设、生态修复等全球重点工程领域,石笼网的品质直接决定工程安全与使用寿命。据国际丝网产业协会(ISIA)2025 年 11 月最新测评数据显示,全球石笼网市场合格率仅为 72%,部分产品因材质劣质、工艺…

2025 年 11 月石笼网厂家最新推荐,技术实力与市场口碑深度解析!

在全球水利工程、边坡防护、生态治理等领域,石笼网的技术工艺与产品品质直接影响工程安全稳定性。据国际建筑防护材料协会(IBPMA)2025 年 11 月发布的测评报告显示,全球石笼网企业中仅 38% 具备核心生产技术专利,…