【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(2)

比赛链接
本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。
跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18773190

开题 + 补题情况

很唐的一场比赛,前四个签到题都做了八百年,然后又被博弈论硬控了,
image

1002 - 学历史导致的

签到题,由于数据范围只有几十,所以直接枚举暴搜就行。

点击查看代码
#include <bits/stdc++.h>
#define inf 2e18
#define int long longconst int N = 2e5 + 9;std::string a[] = {"jia", "yi", "bing", "ding", "wu", "ji", "geng", "xin", "ren", "gui"};
std::string b[] = {"zi", "chou", "yin", "mao", "chen", "si", "wu", "wei", "shen", "you", "xu", "hai"};void solve()
{std::string s;std::cin >> s;for(int i = 1984;i <= 2043;i ++) {int ch = i - 1984;int x = ch % 10;int y = ch % 12;std::string t = a[x] + b[y];if(s == t) {std::cout << i << '\n';return;}} 
}

1004 - 学 DP 导致的

注意到最长答案只会是 \(26\),所以最多复制26次就行。
乍一看以为要用单调栈优化法或线段树优化法找最长上升子序列,结果定睛一看,都是小写字母,那范围也就 \(26\),直接暴力 DP 就行了。

点击查看代码
#include <bits/stdc++.h>
#define inf 2e18
#define int long longconst int N = 2e5 + 9;int toint(std::string &s) {int res = 0;for(auto &i : s) {res = res * 10 + i - '0';}return res;
}void solve()
{std::string s;std::cin >> s;std::string k;std::cin >> k;int x;if(k.size() > 2) {x = 100;} else {x = toint(k);}std::string tmp = s;for(int i = 1;i < x;i ++) {s += tmp;}std::vector<int> dp(27, 0);auto getint = [](const char c) -> int {return c - 'a' + 1;};int ans = 0;for(auto &i : s) {int ix = getint(i);for(int j = 0;j < ix;j ++) {dp[ix] = std::max(dp[ix], dp[j] + 1);}ans = std::max(ans, dp[ix]);}std::cout << ans << '\n';
}

1003 - 学数数导致的

一开始读错题了,写了半天,以为是找不同的下标构成的题目的构造,然后定睛一看是找不同的数字构成的,这难度一下就下降了不少。
我们可以动态维护一下当前前缀每个数字的总数,然后从后往前遍历,记录一下后面出现了多少个不同的正整数 \(sum\),然后对于每一个数字,如果有间隔 \(0\) 的它自己,就更新一下它的答案最大值,也就是当前的 \(sum\),最后求一个和。
这个题有一个很关键的点在于要以 \(0\) 为分界点清除每个数字作为 \(p\) 的数量,否则可能不间隔 \(0\) 也被算进去了。

点击查看代码
#include <bits/stdc++.h>
#define inf 2e18
#define int long longconst int N = 1e6;void solve()
{int n;std::cin >> n;std::vector<int> a(n);for(auto &i : a) {std::cin >> i;}std::vector<int> cnt(N + 9, 0), all(N + 9, 0);std::vector<bool> vis(N + 9, 0);for(int i = 0;i < n;i ++) {cnt[a[i]] ++;}int ans = 0;int sum = 0;vis[0] = true;for(int i = n - 1;i >= 0;i --) {if(a[i] == 0) {cnt[a[i]] --;continue;}if(!cnt[0])break;int ix;for(int j = i;j >= 0 && a[j] != 0;j --) {cnt[a[j]] --;ix = j;}for(int j = i;j >= 0 && a[j] != 0;j --) {if(a[j] && cnt[a[j]]) {all[a[j]] = std::max(all[a[j]], sum);}sum += !vis[a[j]];vis[a[j]] = true;}i = ix;}for(int i = 1;i <= N;i ++) {ans += all[i];}std::cout << ans << "\n";
}

1005 - 学几何导致的

不难发现,垂直的,其实就是旋转了 \(90\) 度的,也就是说:\((180 / k) \times x = 90 \times p\)\(p\) 为奇数,移项消元后可以得到:\(2 \times x = k \times p\),式子左边一定是一个偶数,\(p\) 是一个奇数,若要让式子成立,\(k\) 必须是一个奇数,因此所有奇数 \(k\) 答案都是 \(0\)
然后,我们求出的 \(x\),也就是一个 \(90\) 度的循环,那么我们按 \(x\) 进行分块,对于奇数块中的线,和它垂直的就是偶数块中的对应位置的线,对于偶数块中的线,和它垂直的就是奇数块中的对应位置的线。
我们首先将最后对 \(2 \times x\) 取模后不完整的块往前匹配特殊计算一下。
然后对于剩下的,为了避免计算重复,每个块只和后面的块匹配,不难发现对于奇数块可以得到一个 \(1\) ~ \(n / 2x\) 的公差为 \(1\) 的等差数列,对于偶数块可以得到一个 \(1\) ~ \(n / 2x - 1\) 的公差为 \(1\) 的等差数列,分别对等差数列求和后,再乘一个 \(x\) 将块中的元素个数的贡献加上来即可。

点击查看代码
#include <bits/stdc++.h>
#define inf 2e18
#define int long longconst int N = 2e5 + 9;void solve()
{int n, k;std::cin >> n >> k;int ans = 0;if(k & 1) {std::cout << 0 << '\n';return;}int x = k / 2;int ch = n % x;n -= ch;int p = n / x;if(p & 1) {int sum = n / (2 * x) + 1;ans += ch * sum;} else {int sum = n / (2 * x);ans += ch * sum;}ch = n % (2 * x);n -= ch;if(ch) {int sum = n / (2 * x);ans += ch * sum;}int sum = n / (2 * x);if((sum + 1) & 1) {ans += sum / 2 * (sum + 1) * x;ans += sum / 2 * (sum - 1) * x;} else {ans += (sum + 1) / 2 * sum * x;ans += (sum - 1) / 2 * sum * x;}std::cout << ans << '\n';
}

1006 - 学博弈论导致的(补题)

被博弈论创似了。
题目说了一大堆,但如果给红宝石赋值为 \(1\),蓝宝石赋值为 \(2\),宝箱赋值为 \(4\),就可以把题目中所有操作拿掉的值控制在 \(1\) ~ \(3\),然后就是一个 NIM 游戏了。
好像是很常用的套路,算是学到了。

点击查看代码
#include <bits/stdc++.h>
#define inf 2e18
#define int long longconst int N = 2e5 + 9;void solve()
{int x, y, z;std::cin >> x >> y >> z;if((x + 2 * y) % 4 == 0) {std::cout << "Bob\n";} else {std::cout << "Alice\n";}
}

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

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

相关文章

每日总结开发简单app

学习的技能/知识 运动 提升 不足学会了用Android Studio开发简单app 20分钟运动 抵住了手机的诱惑,写了3个小时的作业 因为一些情感原因,一上午的课都在走神,收获很少使用Android Studio开发app流程 1.下载Android Studio开发工具,并完成相关配置的下载 2.完成了课堂测试任…

WSL2添加音频驱动

前言 接上一篇,在将USB麦克风接入WSL2后,就想尝试进行录音的操作了。但尝试了之后发现 WSL2 当中缺少音频驱动。 原因 WSL2使用的是微软定制的Linux内核,为了保持轻量级,默认不包含许多硬件驱动,包括音频驱动。即使通过usbipd成功共享了USB设备,WSL2也无法加载必要的音频…

2021年-PTA模拟赛-L2-1 彩虹瓶(栈+模拟)

栈+模拟用栈模拟货架,测试点1不过的,不能不满足就马上break,必须输入完整AcCode: #include<iostream> #include<stack> using namespace std; int main(){int N, M, K;cin >> N >> M >> K;while(K--){stack<int> s; //模拟货架int t = …

第二次个人编程作业

1. 作业信息 课程名称: 软件工程 作业要求: 论文查重 作业目标: 使用PSP预估开发时间并返回测试结果 2. 目录3. Gitcode链接地址 Gitcode仓库链接 4. PSP表格5. 计算模块接口的设计与实现过程 设计思路 根据题意,我们需要实现一个简单的论文查重系统。选择使用余弦相似度计算论…

iPad mini2 使用LeetDown降级10.3.3,使用Sliver完美绕过激活锁

在之前的文章ipad mini2 绕过激活锁中,绕过激活锁的方法是不完美的,重启后需要重新激活ID。经过一番搜索,找到了相对完美的方法:先通过LeetDown工具将iPad降级到10.3.3版本,再通过Sliver利用ipwndfu漏洞,在初次系统启动之前(非常重要!) 将payload文件注入到iPad中,从…

基于BBO生物地理优化的三维路径规划算法MATLAB仿真

1.程序功能描述 基于BBO生物地理优化的三维路径规划算法MATLAB仿真,通过BBO优化算法,以及起点和终点坐标,获得三维空间避障路线规划,并输出BBO的优化收敛曲线。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序Pos0 = {[2,…

upload-labs pass-02

这次直接上传一句话木马并且禁止JavaScript验证也不行了,上传一个图片试试看来图片可以上传像上一道题一样上传时抓包再修改文件内容后缀,成功了那能不能上传一句话木马然后修改文件类型呢将content-type修改为image/jpeg、image/png、image/gif中的任何一种成功了

upload-labs pass-03

直接上传一句话木马告诉我提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!点击查看代码 这次哪怕开启禁用JavaScript验证也不行,这次的验证不是简单的前段验证了,猜测是检测后缀,这时我们可以使用phtml文件 通常,在嵌入了php脚本的html中,使用 phtml作为后缀名;完全是ph…

2025 联合省选游记:Last Dance

应该说我与 OI 是好久不见了。 去年的省选一败涂地,成为了我心中不小的伤痕。考完后同被击杀的易敬然跟我说“noip 是咋考的啊这群人,我去”,我只能苦笑。就算是两个月前,MO 上取得的些许成就已可权且抹去 OI 的不济,但和李朝晖老师谈到是否还准备复刻 cyk 的战绩时(他好…

DVWA-CSRF-High

代码中加入了token 的判断;用户admin/password 登陆,修改密码,并使用BP抓包使用smithy/password登陆,右键检查->Elements,找到修改按钮处的代码位置,获取最新的user_token(刷新页面可以看到token一直在变;用户登陆成功后服务器生成token和token 失效时间,客户端请求…

DVWA-CSRF-Medium

用户admin/password 登陆,修改密码,并使用BP抓包使用smithy/password登陆,重放抓到的BP包,smithy 密码将被修改重点是确保Referer 的信息存在,且和admin/password 修改密码时使用的一致代码审计:通过代码可以看出,如果在Referer中找到服务器名称才会执行参数修改工作,因…

C++继续学习2025_练习

课堂练习题3月15练习题 完善程序,输入到计算机运行,得到要求的结果。 1、编程序输出如图所示的图形。11111222223333344444#include <iostream> using namespace std; int main() {int i, j;for(i=1;____;i++){for(j=1;_______;j++)cout<<________;cout <<…