Codeforces Round 1057 (Div. 2)

news/2025/10/11 1:02:15/文章来源:https://www.cnblogs.com/maburb/p/19134133

A. Circle of Apple Trees

题意:一个环形数组,每次到一个位置可以选择拿走这个元素或者跳过,然后走到下一个位置。每次拿的数要比之前拿的大,求最多拿多少数。

显然可以从小到大拿,那么答案就是不同数的个数。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::set<int> s(a.begin(), a.end());std::cout << s.size() << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

B. Bitwise Reversion

题意:给你\(x, y, z\),求有没有\(a, b, c\)满足\(a \& b = a, b \& c = y, a\& c = z\)

那么如果\(x, y, z\)中有一位是两个数有另一个数没有的,无解。
例如\(x, y\)\(k\)位是\(1\)\(z\)\(k\)位是\(0\),那么发现\(a, b, c\)的第\(k\)位都是\(1\)。则\(a \& c\)\(k\)位一定是\(1\)

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int a[3]{};for (int i = 0; i < 3; ++ i) {std::cin >> a[i];}for (int i = 0; i < 30; ++ i) {int cnt = (a[0] >> i & 1) + (a[1] >> i & 1) + (a[2] >> i & 1);if (cnt == 2) {std::cout << "NO\n";return;}}std::cout << "YES\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

C. Symmetrical Polygons

题意:给你\(n\)条长度为\(a_i\)的木棒,求用它们一些组成的对称凸多边形的最大周长是多少。

如果一个长度出现偶数次,我们就可以把它们都拿走。对于出现奇数次的长度,留一个不拿。
那么在拿了至少两个木棒的情况下,最多拿两个留下的木棒。拿一个的情况就是如果已有总长度大于当前木棒长度这个木棒就可以拿,拿两个的情况就是当前总长度加短的那个木棒的长度大于长的木棒长度就可以拿,枚举长的那个木棒的长度,那么短的肯定选比它短的里最长的最优。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<i64> a(n);std::map<i64, i64> mp;for (int i = 0; i < n; ++ i) {std::cin >> a[i];++ mp[a[i]];}i64 sum = 0;std::vector<i64> b;i64 cnt = 0;i64 len = 0;for (auto & [x, y] : mp) {if (y % 2 == 0) {sum += y * x;cnt += y;} else {sum += (y - 1) * x;cnt += (y - 1);b.push_back(x);}}i64 ans = 0;if (cnt >= 3) {ans = sum;}if (cnt == 0) {std::cout << 0 << "\n";return;}std::ranges::sort(b, std::greater<>());for (auto & x : b) {if (sum > x) {ans = std::max(ans, sum + x);}}for (int i = 1; i < b.size(); ++ i) {if (sum + b[i] > b[i - 1]) {ans = std::max(ans, sum + b[i] + b[i - 1]);}}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

D. Not Alone

题意:一个环形数组,你每次可以把一个数加一或减一,求使得每个位置至少有一个相邻的数和它相同的最小操作数。

结论是把每个相同段长度为\(2\)或者\(3\)是最优的。长度为\(2\)的代价为\(|a_i - a_{i+1}|\),长度为\(3\)的代价为\(\max\{a_{i-1}, a_i, a_{i+1}\} - \min\{a_{i-1}, a_i, a_{i+1}\}\)
证明就是,对于长度为\(m \geq 4\)的相同块,记为\(b_1, b_2, ... , b_m\),最后都变成\(x\),那么代价为\(\sum_{i=1}^{m} |b_i - x|\),拿出后两个来,代价为\((\sum_{i=1}^{m-2} |b_i - x|) + |b_{m-1} - b_{m}|\)。发现只有\(x = b_{m-1}\)\(x = b_{m}\)时才有\(|b_{m-1} - x| + |b_{m} - x| = |b_{m-1} - b_{m}|\),其它情况都是大于\(|b_{m-1} - b_{m}|\)。所以把最后两个分出来代价只会不变或减少。同理分出来三个也是一样的。

那么如果不是环形数组的话,考虑\(dp\),有\(f[i] -> f[i + 2] + |a_{i+1} - a_{i+2}|\)\(f[i] -> f[i + 3] + max\{a_{i+1}, a_{i+2}, a_{i+3}\} - \min\{a_{i+1}, a_{i+2}, a_{i+3}\}\)
现在考虑环形,那么只需要考虑\(a_1, a_n\)相同,\(a_1, a_{n}, a_{n-1}\)相同,\(a_1, a_2, a_n\)相同的情况。那么其它部分是连续的,可以看作一个一维数组去\(dp\)

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<i64> a(n + 2);for (int i = 1; i <= n; ++ i) {std::cin >> a[i];}a[n + 1] = a[1];a[0] = a[n];std::vector<i64> c1(n + 1), c2(n + 1);for (int i = 1; i <= n; ++ i) {c1[i] = std::abs(a[i] - a[i + 1]);i64 max = std::max({a[i], a[i - 1], a[i + 1]});i64 min = std::min({a[i], a[i - 1], a[i + 1]});c2[i] = max - min;}constexpr i64 inf = 1e18;auto dp = [&](int l, int r) -> i64 {std::vector<i64> f(n + 1, inf);f[l - 1] = 0;for (int i = l - 1; i + 2 <= r; ++ i) {f[i + 2] = std::min(f[i + 2], f[i] + c1[i + 1]); if (i + 3 <= r) {f[i + 3] = std::min(f[i + 3], f[i] + c2[i + 2]);}}return f[r];};i64 ans = dp(1, n);if (n > 3) {ans = std::min(ans, c1[n] + dp(2, n - 1));}if (n > 4) {ans = std::min(ans, c2[n] + dp(2, n - 2));ans = std::min(ans, c2[1] + dp(3, n - 1));}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

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

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

相关文章

“表达式”(Expression)和“语句”(Statement)概念辨析

在编程中,“表达式”(Expression)和“语句”(Statement)是两个基础且容易混淆的概念。它们的核心区别在于是否有返回值以及在代码中的作用,以下从定义、特点、示例三个维度详细说明: 一、定义与核心区别表达式(…

每日一题 ###121买卖股票的最佳时机

仅以此记录所学所想,如有错误,还望指正。 首次尝试 1、我小小的脑子只能想出暴力解法,结果是超时了。 class Solution { public:int maxProfit(vector<int>& prices) {int max=0;for(int i=0;i<prices…

10.10总结

1.将一个数组中的值按逆序重新存放进行了编程联系,生成了对应程序 2.明天学习完善程序细节 3.今天收获满满

LibreChat-图文并茂手把手教你界面配置 | Adorable LibreChat Interface Configuration Guide

@目录🎀 整体介绍 | Overview🍪 配置项详解 | Field Details🎨 开关大全 | All Switches✨ 配置示例 | Cute ExampleConclusion | 结语 🎀 整体介绍 | Overview 今天我们来学习一下,LibreChat的页面基础配置哇…

GAE-广义优势估计算法介绍

一句话总结 GAE 就像「既要稳又要准」的聪明妥协:用多步 TD 误差加权平均,既缓解了 MC 的高方差,又减少了 TD 的单一偏差,通过调节参数(λ)灵活平衡两者的优缺点。MC vs TD 的痛点MC(蒙特卡洛):原理:跑完整个…

qemu模拟单片机

ESP32 乐鑫官方移植的qemu工程:espressif/qemu: Fork of QEMU with Espressif patches. See Wiki for details. 官方使用说明:esp-toolchain-docs/qemu/README.md at main espressif/esp-toolchain-docs 目前支持ES…

RAG-检索增强生成

检索增强生成(Retrieval-Augmented Generation, RAG)是近年来深度学习领域的重要技术突破,旨在解决大语言模型(LLM)在知识更新、事实准确性以及领域专业化方面的局限性。本文将从核心架构、功能实现、实践规范到高…

“猴子补丁”(monkey patch)跟猴子有关吗?

“猴子补丁”(monkey patch)指的是使函数名指向另一个函数。 这个名字里的“猴子”(monkey)和真实的动物猴子没有任何生物学或实体关联,它是编程领域的一个形象比喻,名字的由来与“猴子”的俚语含义有关。 为什么…

Yapi 使用docker在cenos7上部署教程与基本使用

✅ 前提条件 确保你已经完成以下准备:CentOS 7 系统已安装 Docker(未安装请先安装)拥有管理员权限(root 或 sudo)1、安装mongo数据库# 拉取mongo镜像,有本地镜像包可以直接导入 docker pull mongo # 安装mongo数…

C语言vsC++

一、核心区别设计理念C 语言:面向过程(Procedure-Oriented),以函数和数据结构为核心,强调算法和步骤的实现,关注 “怎么做”。 C++:基于 C 语言扩展而来,支持面向对象编程(Object-Oriented,OO),引入类、对…

20251010 之所思 - 人生如梦

20251010 之所思这两天想的事情有点多,有点焦虑,因为刚刚升职,部门的软件需要管理起来,已经不再仅仅管理自己现在的一个小组,今天看了一下软件的人数,数量已经到了122人,这是一个很庞大的队伍,如何管理好,心里…

2025.10.10

今天学生会开会导致十点没有回到宿舍 今天一节英语课,单词背诵情况不好,以后会加强 尝试轻食餐,不好吃

个人书单-从心流出发,学习积极心理学

从“心流”出发,构建你的积极心理学知识体系 | 专题书单 你是否曾有过这样的体验:在全神贯注地工作、运动或创作时,忘记了时间的流逝,内心充满了一种纯净而高效的愉悦感? 这就是米哈里契克森米哈赖所描述的 “心流…

等号(=)在C语言和python中有什么区别?

等号(=)在C语言和python中有什么区别? 等号(=)在 C 语言和 Python 中虽然核心功能都是“赋值”,但由于两种语言的设计理念(静态类型 vs 动态类型、编译型 vs 解释型)存在根本差异,= 的行为、特性和使用场景有…

AI元人文(十四)之价值共生篇:再论物物交换——作为价值共生基础的元协议

AI元人文(十四)之价值共生篇:再论物物交换——作为价值共生基础的元协议 文 / 岐金兰 摘要: 本文是对前文《AI元人文(十四):物物交换——论跨领域价值协商的元协议》提出的“物物交换”元协议的深化探讨。文章将…

4.布局系统

Aquarius 开发框架旨在帮助独立开发者和中小型团队,完成 iOS App 的快速实现与迭代。使用框架开发将给你带来简单、高效、易维护的编程体验。大家好,我是K哥。一名独立开发者,同时也是Swift开发框架【Aquarius】的作…

虚拟环境QA

Dingxingdi: 我使用conda激活虚拟环境之后,就可以像往常一样使用命令了吗?不需要在命令前面加一个conda吗? GitHub Copilot: 可以直接像平常一样运行命令,不需要在命令前加 conda。激活环境(例如 conda activate …

提升高度的网站

真相查询类Snopes https://www.snopes.comWikipedia(英文) https://en.wikipedia.org全球时事类 3. Foreign Affairs https://www.foreignaffairs.comBrookings https://www.brookings.edu课程学习类 5. Open Yale C…

day009

今日完成:css页面的格式排布设置,页面的字体颜色设置有了一定的了解. 明日完成:css,html 遇到问题:无

java基础2-运算符

运算符:对字面量或者变量进行操作的符号 表达式:用运算符把字面量或者变量连接起来,符合java语法的式子就可以成为表达式。 1.算数运算符:int c = a + b; +:是运算符,并且为算数运算符; a + b 是表达式,由于+时…