牛客周赛 Round 86

news/2025/3/25 19:34:27/文章来源:https://www.cnblogs.com/maburb/p/18788314

A. 小苯跑外卖

点击查看代码
void solve() {int x, y;std::cin >> x >> y;std::cout << (y + x - 1) / x << "\n";
}

B. 小苯的区间删除

任意次操作,把负数都删掉就行。

点击查看代码
void solve() {int n, k;std::cin >> n >> k;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}i64 ans = 0;for (int i = 0; i < n; ++ i) {ans += a[i] > 0 ? a[i] : 0;}std::cout << ans << "\n";
}

C. 小苯的数字消除

题意:给你一个\(01\)串,你每次可以选择两个相邻且相等的数同时删去。你可以更改任意位置,求使得最后串剩下的数小于等于1个的最小更改数。

先用栈模拟一遍,类似括号匹配,每次遇到相同的消去。
最后剩下的是一个01相间的串,形如\(010101..\)这种。这个串需要\(\frac{len}{2}\)次操作。

点击查看代码
void solve() {int n;std::cin >> n;std::string s;std::cin >> s;std::stack<char> stk;for (int i = 0; i < n; ++ i) {if (stk.size() && stk.top() == s[i]) {stk.pop();} else {stk.push(s[i]);}}int ans = (int)stk.size() / 2;std::cout << ans << "\n";
}

D. 小苯的数字集合

题意:有一个可重集合。一开始有两个数\(x, y\)。你每次可以选择集合的两个数,然后把它们的与值或者或值或者异或值或者\(gcd\)插入集合。求使得集合出现\(0\)的最少操作数。

首先我们最多需要三次操作,因为\(a \oplus b = c, c \oplus b = a, a \oplus a = 0\)
那么我们分类讨论,一次操作的情况只有与操作和异或操作可以实现。
然后是两次操作的情况,我们把每个操作的值都插入,然后枚举它和\(x, y\)进行的操作看能不能得到\(0\)
否则答案就是3。

点击查看代码
void solve() {int x, y;std::cin >> x >> y;//x^y=z//z^y=x//x^x=0if ((x & y) == 0 || (x ^ y) == 0) {std::cout << 1 << "\n";} else {std::vector<int> a{x & y, x | y, x ^ y, std::gcd(x, y)};for (auto & z : a) {if ((x & z) == 0 || (x | z) == 0 || (x ^ z) == 0 || (y & z) == 0 || (y | z) == 0 || (y ^ z) == 0) {std::cout << 2 << "\n";return;}}std::cout << 3 << "\n";}
}

E. 小苯的Polygon

题意:给你\(n\)个木棍,每个木棍有长度,你要用他们构造一个凸多边形,使得这个凸多边形的周长最小。

凸多边形的任意一条边长度都比其它\(n-1\)条边的长度之和小。
那么我们枚举最长的一条边,然后把比它小的边进行背包\(dp\)求出可以凑出的长度,取最接近它的。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}if (n < 3) {std::cout << -1 << "\n";return;} else if (n == 3) {if (a[0] + a[1] <= a[2] || a[0] + a[2] <= a[1] || a[1] + a[2] <= a[0]) {std::cout << -1 << "\n";} else {std::cout << a[0] + a[1] + a[2] << "\n";}} else {std::ranges::sort(a);int ans = -1;std::bitset<10010> b;b[0] = 1;for (int i = 0; i < n; ++ i) {if (i >= 2) {for (int j = a[i] + 1; j <= 10000; ++ j) {if (b[j]) {if (ans == -1 || a[i] + j < ans) {ans = a[i] + j;}break;}}}b |= b << a[i];}	std::cout << ans << "\n";}
}

F. 小苯的线性dp

题意:给你一个数组,每次你可以进行一次合并操作,把两个数更换为它们的和。求分别在\([0, n - 1]\)操作后数组的最大极差。

首先我们想,合并的这些区间应该尽可能是一个区间,因为我们要让最大值最大,所以应该把数都合并到一起,不过也会出现操作两个区间的情况,这个下面会说。
我们可以用\(st\)表维护区间最大最小值,枚举操作的区间,那么假设这个区间的长度为\(len\),则\(ans[len - 1] = \min(ans[len - 1], \max(sum[i..j], left_{max}, right_{max}) - \min(left_{min}, right_{min})\)
然后我们考虑操作了两个区间的情况,这种情况就是最小值和其它值相差太大,导致我们不能合并这个最小值,于是只能跨过它,进行一些无效操作。那么这意味着\(ans[i] = \max(ans[0], ans[1], .., ans[i - 1], ans[i])\)。但注意最后如果合并到只剩三个数,就是中间是最小值的情况,我们还要进行操作就只能合并它,所以\(ans[n - 2]\)不能和前面的取最大值。
不过\(ac\)后面发现其实我们求的是前后缀的最大最小值,似乎不需要\(st\)

点击查看代码
const i64 inf = 1e18;template <class Info> 
struct ST {std::vector<std::vector<Info>> st;ST(std::vector<Info> a) {int n = a.size(), m = std::__lg(n) + 1;st.assign(n, std::vector<Info>(m));for (int i = 0; i < n; ++ i) {st[i][0] = a[i];}for (int j = 1; j < m; ++ j) {for (int i = 0; i + (1 << j - 1) < n; ++ i) {st[i][j] = st[i][j - 1] + st[i + (1 << j - 1)][j - 1];}}}Info query(int l, int r) {if (l > r) {return {-inf, inf};}int lg = std::__lg(r - l + 1);return st[l][lg] + st[r - (1 << lg) + 1][lg];}
};struct Info {i64 max, min;
};Info operator + (const Info & a, const Info & b) {Info res{};res.max = std::max(a.max, b.max);res.min = std::min(a.min, b.min);return res;
}void solve() {int n;std::cin >> n;std::vector<int> a(n);std::vector<Info> info(n + 1);for (int i = 0; i < n; ++ i) {std::cin >> a[i];info[i + 1] = {a[i], a[i]};}ST<Info> st(info);std::vector<i64> sum(n + 1);for (int i = 1; i <= n; ++ i) {sum[i] = sum[i - 1] + a[i - 1];}std::vector<i64> ans(n);ans[0] = st.query(1, n).max - st.query(1, n).min;for (int i = 1; i <= n; ++ i) {for (int j = i + 1; j <= n; ++ j) {auto l = st.query(1, i - 1);auto r = st.query(j + 1, n);ans[j - i] = std::max(ans[j - i], std::max({sum[j] - sum[i - 1], l.max, r.max}) - std::min(l.min, r.min));}}for (int i = 1; i + 2 < n; ++ i) {ans[i] = std::max(ans[i], ans[i - 1]);}for (int i = 0; i < n; ++ i) {std::cout << ans[i] << " \n"[i == n - 1];}
}

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

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

相关文章

llm 量化技术综述

综述: LLM 量化 1. Intro 低比特量化主要是减少tensor的bit-width,可以有效减少内存以及计算需求;主要可以压缩权重, 激活值, 和梯度,使得可以在受限资源的设备上使用。 2. 低比特LLM的基础 在这一届,我们主要引入从以下三个方面讨论:low-bit 数值格式 量化粒度 动态或者静…

Top 出海 AI 公司招技术!HIX.AI Pollo.ai | 深圳

HIX.AI & Pollo.ai 招聘高级海外 AI 产品经理 (25-45K) 岗位职责:负责Web 端海外 AI 产品的规划与策划,负责产品需求分析及原型设计,并制定方案推动产品研发落地; 进行产品/竞品调研,了解用户需求,分析、发现需求本质,并给出对应的解决方案; 有效对接开发、测试、运…

2、切片

一:字符串的下标(索引)--重点 ​ Ⅰ:字符串的特性,被称为下标或者 sequence(序列) ​ Ⅱ:一个序列。若干元素组成 ​ Ⅲ:字符串的下标从0开始》标记每个元素的位置,用来获取元素》从左到右,从0开始> a[0],a[1] ,a[3]》可以用正数表示,也可以用负数表示》最…

WEBGL 学习使用代码

目录杂七杂八第一节 绘制出了一个点第二节 动态传递点数据第三节 缓冲区和画线第四节 彩色线段第五节 单个 buffer 渲染颜色第六节 抽离代码 & 画彩色三角形第七节 图元的七种绘制方式第八节 uniform 传值变换数据第九节 旋转矩阵三角函数矩阵的计算推导代码实现第十节 线框…

Kettle 版本这么多,到底该怎么选?

Kettle(Pentaho Data Integration)作为一款功能强大的开源 ETL(Extract, Transform, Load,即数据抽取、转换和加载)工具,拥有众多版本,这让许多用户在选择时犯了难。 1、提出问题 经常有群友提出使用kettle版本的问题,如下图所示:2、kettle版本 有许多的的历史版本,…

C++实验二

实验一#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 5int main() {int number;int i;srand(time(0)); // 以当前系统时间作为随机种子for(i = 0; i < N; ++i) {number = rand() % 100 + 1;printf("20490042%04d\n", n…

ESP32 Audino 驱动12864点阵屏 自定义中文字库

一.安装u8g2 #include <Arduino.h> #include <U8g2lib.h>U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE, /* clock=*/22, /* data=*/21); // ESP32 Thing, HW I2C with pin remappingvoid setup(void) {u8g2.begin();u8g2.enableU…

Linux 离线安装 lz4

前言:本文操作是在 CentOS-7 下执行的,不确定在其他 Linux 发布版是否能同样正常执行。1、检查前置依赖组件在安装 lz4 之前,需要确认已安装了相关依赖组件: gcc 。 rpm -qa | grep gcc前置依赖组件的具体离线安装方法请参考:CentOS-7离线安装gcc 2、下载lz4安装包 官方下…

sql语句把图片存入数据库

这是一个小的练习,目的是把图片以二进制字符串形式存入sql数据库表中,后续练习尝试在WINCC把其还原成图片。 在以前的数据库MyDB中新建一个数据表,有四个字段: imageID 类型为bigint,作为标识符,自增1 mydatetime 日期事件类型 imagename varchar(100)数据类型 imagedata…

FSRCNN:加速超分辨率卷积神经网络

作为一种成功的图像超分辨率 (SR) 深度模型,超分辨率卷积神经网络 (SRCNN) 在速度和恢复质量方面都表现出优于以往手工制作模型的性能。然而,高计算成本仍然阻碍了它需要实时性能 (24 fps) 的实际使用。在本文中,我们旨在加速当前的 SRCNN,并提出一种紧凑的沙漏形 CN…

GNSS测量实习

实 习 报 告学院:建筑工程与空间信息学院 专业:地理信息科学 实习性质:校内实习 实习单位:建筑工程与空间信息学院 指导教师:冯建迪目录 一、实习的性质和目的要求 二、实习的任务和内容 三、静态测量 3.1 静态测量简介 3.2作业流程 3.3注意事项 3.4 GPS 控制网设计…