USST-vj-蓝桥杯训练-2025.03.05

news/2025/3/6 2:55:42/文章来源:https://www.cnblogs.com/YoruKiri/p/18754098

感觉难度不是顺序的,感觉是 B < C = E = F < G < A < D < H


A

显然是一道01背包的变体,把不选择改成加上lost[i]即可

关键代码

for (int i = 1; i <= n; ++ i) {for (int j = x; j >= 0; -- j) {if (j >= u[i]) f[j] = max(f[j] + l[i], f[j - u[i]] + w[i]);else f[j] += l[i];}
}

B

用高精度-单精度乘法即可,也没什么好讲的,具体原理可以去 OI-Wiki 学习

关键代码

void mul_short(vector<int> &a, int b) {for (int i = 0; i < a.size(); ++i) {a[i] *= b;if (i) {a[i] += a[i-1] / 10;a[i-1] %= 10;}}while (a.back() >= 10) {int tmp = a.back() / 10;a.back() %= 10;a.push_back(tmp);}
}

C

对于第 \(i\) 头牛,查找左右最远的能听到声音的牛,显然可以用二分找到对应区间 \([l,\ r]\)

关键代码

#define all(a) a.begin(), a.end()for (int i = 0; i < n; i ++) {int l = lower_bound(all(p), p[i]-d) - p.begin();int r = upper_bound(all(p), p[i]+d) - p.begin() - 1;ans += r - l;
}

D

问题描述很清晰,比较考验积累,如果知道相关公式就很简单,难度较高是因为可能很多人不记得,需要现推

第二类斯特林数

可记做 \(S(n,k)\) ,表示将 \(n\) 个两两不同的元素,划分为 \(k\)  个互不区分的非空子集的方案数。
递推式

\[S(n, k) = k\ \cdot S(n-1, k) + S(n-1, k-1) \]

边界值就是 \(S(n, k) = 1\ [n = k]\)\(S(n, k) = 0\ [m=0或m>n]\)

通项公式

\[S(n, k) = \sum^k_{i=0} \frac{(-1)^{m-i}\ i^n}{i!\ (m-i)!} \]

展示一下递推式的写法

int S(int n, int m) {if (n == m) return 1;if (m == 0 || m > n) return 0;return m * S(n-1, m) + S(n-1, m-1);
}

现在算出不区分箱子的情况了,那么答案就是 \(S(n, r) * r!\)


E

数据范围很小,所以暴力即可,枚举每一个城市算出总路费,取最小值即可

关键代码

struct city {int cnt, d;string name;bool operator < (const city &other) const {return d < other.d;}
};
-----------------------------------------------------
city ans{inf, 0, ""};
for (int i = 0; i < n; i ++) {int sum = 0;for (int j = 0; j < n; j ++) {sum += abs(c[i].d - c[j].d) * c[j].cnt;}if (sum < ans.cnt) {ans = {sum, 0, c[i].name};}
}

F

不懂为什么叫增强版,数据范围也不大,纯模拟即可

算出总共种了几棵树苗,最后看看剩下几颗树苗,减一下就好

关键代码

vector<pii> tr(L + 1, {1, 0});
int sum{ 0 }, cnt{ 0 };
while (n --) {int op, l, r;cin >> op >> l >> r;for (int i = l; i <= r; i ++) {if (op) {if (!tr[i].first) {sum ++;tr[i].second = 1;}tr[i].first = 1;} else {tr[i] = {0, 0};}}
}
for (int i = 0; i <= L; ++ i) {cnt += tr[i].second;
}

G

没啥好说的,01背包板子题,感觉接触过背包的都见过这题了,不了解原理的可以取洛谷搜索“背包九讲”,非常详细

关键代码

vector<int> w(n+1), v(n+1), f(W+1);
for (int i = 1; i <= n; ++ i) {for (int j = W; j >= w[i]; -- j) {f[j] = max(f[j], f[j-w[i]] + v[i]);}
}
cout << f[W];

H

本场最有难度的一题

首先你要知道如何求 最大子段和
原理网上有很多详细讲解,这里贴一下代码

int ans = -inf, sum = 0;
for (int i = 0; i < n; i ++) {sum = max(sum + a[i], a[i]);ans = max(ans, sum);
}

\(ans\) 即为数组 \(a\) 的最大子段和,这里要求子段不能为空,如果可以为空,则 \(ans\) 初始值修改为 \(0\)

然后进阶到 环状最大子段和
成环后,子段可能有两种情况("-"表示对应区间)

  • 区间不跨端点:........---.....
  • 跨端点:---.........--

第一种情况可以直接求最大子段和,第二种应该怎么搞呢?

假设数列 \(a\) 和为 \(SUM\) 最大子段和为 \(sum\) ,那么显然有 \(SUM - sum\)最小子段和,如果我们知道了最小子段和,也就可以算出第二种情况下的最大子段和

最小子段和怎么求呢?我们只需要把数组 \(a\) 全部取相反数,这时再算最大子段和,那对应的就是原数组的最小子段和。

现在单个区间的最大子段和会算了,那就可以求两个区间了

首先思考可能的区间分布,跨端点的区间显然最多存在一个

  • .....---.......-----........
  • ---........----......----

那么我们维护两个数组 \(f_i\)\(g_i\)

  • \(f_i\)\([1, i]\) 的最大子段和
  • \(g_i\)\([i, n]\) 的最大子段和

然后就可以 \(O(n)\) 的计算 \(f_i+g_{i+1}\) 取最大值

那么在正常情况下我们可以求第一种分布的答案

取相反数的情况下,用 \(SUM - sum\) 我们可以求第二种分布的答案

特例:如果只有一个正数,那么取相反数后就不会得到正确答案,但这中情况下直接当做第一种情况处理即可(即选择正数和绝对值最小的负数,区间长度为1,一定不会绕回起点)

关键代码

int maxsum() {for (int i = 1; i <= n; ++ i)f[i] = max(f[i-1] + a[i], a[i]);for (int i = 1; i <= n; ++ i)f[i] = max(f[i-1], f[i]);for (int i = n; i > 0; -- i)g[i] = max(g[i+1] + a[i], a[i]);for (int i = n; i > 0; -- i)g[i] = max(g[i+1], g[i]);int res{ -inf };for (int i = 1; i < n; i ++)res = max(res, f[i] + g[i+1]);return res;
};
-------------------------------------------------------
int ans = maxsum();
if (cnt == 1) {//正数数量为1cout << ans;
} else {for_each(all(a), [](int &x){x = -x;}); // 对每个元素取相反数sum += maxsum(); // 取反后的最大子段和相当于 (-1 * 元数组对应子段和)// 总和去掉这一区间就是 sum - (-1 * 元数组对应子段和),所以最后是相加if (!sum) cout << ans; // 如果删掉整个数组,那么直接舍去取相反后的结果else cout << max(sum, ans);
}

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

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

相关文章

The Ethernaut题解

Level_0.Hello Ethernaut安装MetaMask; F12中的Console,一些指令查看state:查看自己的钱包地址->player:查看余额->getBalance(player):查看合约->ethernaut:合约交互,比如查看合约的owner->ethernaut.owner():从水龙头处获得ETH:(可以Sepolia PoW Faucet挖,也可以…

CAN通信

一.什么是CAN总线 1.CAN总线的概念CAN总线(Controller Area Network Bus)控制器局域网总线2.CAN总线的特点 3.常见通信协议对比(UART、IC、SPI、CAN)特性 UART IC SPI CAN全称 Universal Asynchronous Receiver/Transmitter Inter-Integrated Circuit Serial Peripheral In…

typora图床搭建+完美解决PicGo图片上传重命名问题

typora图床搭建+完美解决PicGo图片上传重命名问题typora图床搭建+完美解决PicGo图片上传重命名问题 typora设置上图中第五步需要你下载PicGo应用并安装 PicGo配置 下载安装好后得到如图界面这时需要对该软件进行配置 文档在这里https://picgo.github.io/PicGo-Doc/zh/guide/con…

[NSSCTF 2022 Spring Recruit]ezgame(两种解法)

可以看到,这个题目一打开就是一道简单的小游戏,玩了一会没看到什么提示就打开页面源码看看有没有提示可以看到只要分数超过65就会告诉你flag,但是真的自己去玩基本上是玩不到65分的,于是我尝试修改页面代码看能不能绕过 解法1 由于页面爆炸了,这里就不附上截图,反正修改分…

【转载】VPS、ECS、Docker和k8s

图片及内容均来源于小林coding公众号:面试官:Docker 和 k8s 之间是什么关系? 物理服务器 一台看得见摸得着的机器,其实就是云厂商页面里提到的物理服务器或物理机。不同厂商叫法不同,有的厂商叫它独立服务器。 vps 和 ecs VPS(Virtual Private Server,虚拟专用服务器)。…

【云原生】VPS、ECS、Docker和k8s

图片及内容均来源于小林coding公众号:面试官:Docker 和 k8s 之间是什么关系? 物理服务器 一台看得见摸得着的机器,其实就是云厂商页面里提到的物理服务器或物理机。不同厂商叫法不同,有的厂商叫它独立服务器。 vps 和 ecs VPS(Virtual Private Server,虚拟专用服务器)。…

FastAPI 查询参数完全指南:从基础到高级用法

title: FastAPI 查询参数完全指南:从基础到高级用法 🚀 date: 2025/3/6 updated: 2025/3/6 author: cmdragon excerpt: 探讨 FastAPI 查询参数的核心机制,涵盖从必需与可选参数、默认值到多参数处理的全方位知识。通过详细的代码示例、课后测验和常见错误解决方案,通过类…

[HNCTF 2022 WEEK3]ssssti

[HNCTF 2022 WEEK3]ssssti 首先打开题目这边翻译一下,server-side template injection是服务器模版注入,立马能反应过来是ssti(一般是flask框架) 不管了,直接丢fenjing里面一把梭哈开始扫描了1,不得不感慨fenjing的waf绕过能力是真强一些常见的危险payload也自动帮你试完了…

[安洵杯 2020]Normal SSTI

[安洵杯 2020]Normal SSTI好题目,直接把参数给我了都不用找了打开fenjing直接一把梭哈

[BJDCTF2020]Easy MD5

[BJDCTF2020]Easy MD5一个输入框,无论输入什么都没有回显,使用yakit抓包看看根据返回的数据包可以得知其sql查询语句,我们需要尝试绕过查询语句来获得线索,md5()函数中$pass参数为输入的参数,而true代表一种模式,将字符串md5哈希后转化为二进制类型 MD5语法 标准格式 md5…

【多线程】volatile关键字详解

volatile的作用volatile主要用于解决可见性和有序性的问题,但不保证原子性可见性:线程在操作变量时,会将主存中的变量拷贝一份到本地存储;修改有再找时机写回主存(不可控),这样多线程并发时会导致其他线程看到的数据和当前线程不一致 使用volatile关键字修饰变量,可使得每…

WiFiGrab教程2:一键抓包5G并使用字典破解全流程

本文使用WiFiGrab抓取5G无线网络的握手包,实验对象为自己的路由器,并结合EWSA进行字典攻击,演示暴力破解的原理和全流程操作。WiFiGrab抓包5G 本文使用WiFiGrab抓取5G无线网络的握手包,实验对象为自己的路由器,并结合EWSA进行字典攻击,演示暴力破解的原理和全流程操作。软…