P1792 [国家集训队] 种树

news/2025/1/10 23:07:00/文章来源:https://www.cnblogs.com/maburb/p/18664870

题意:给一个长度为n的环形数组,你要选m个数,满足没有任意两个数的位置相邻,求总和最大。

一开始没仔细看数据范围写了个dp暴力,想着枚举第1个点选还是不选两次dp取最大值。(属于痴心妄想)
后面自己也是看的题解。我们先贪心选最大的,那么它两边就不可以选了,但有可能选两边比选这个更好,那么我们就选两边,这样怎么处理?我们先选了第i个,加上了\(a_i\),那么如果我们不选这个而选旁边两个,是不是要加上\(a_{i-1}\)\(a_{i + 1}\),如何要减掉\(a_i\)。那么我们用一个新点来替代当前点,它的值为\(a_{i-1}\) + \(a_{i + 1}\) - \(a_i\)
因为不能相邻,所以m最多\(\lfloor n \rfloor\)个。
用优先队列模拟即可。

点击查看代码
void solve() {int n, m;std::cin >> n >> m;if (m > n / 2) {std::cout << "Error!\n";return;}std::priority_queue<std::pair<int, int> > heap;std::vector<int> l(n), r(n), val(n);for (int i = 0; i < n; ++ i) {std::cin >> val[i];l[i] = i - 1;r[i] = i + 1;	heap.push({val[i], i});}l[0] = n - 1; r[n - 1] = 0;auto del = [&](int p) -> void {l[r[p]] = l[p];r[l[p]] = r[p];};int ans = 0;std::vector<int> vis(n);while (m -- ) {while (vis[heap.top().second]) {heap.pop();}auto [v, id] = heap.top(); heap.pop();vis[l[id]] = vis[r[id]] = 1;ans += v;val[id] = val[l[id]] + val[r[id]] - v;heap.push({val[id], id});del(l[id]); del(r[id]);}std::cout << ans << "\n";
}

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

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

相关文章

2024.11.7(spring boot 创建数据库)

然后搭建四层架构 controller,mapper,pojo,service创建mapper的映射文件

2024.11.8(spring boot创建数据库)

三、连接数据库 1.编写文件 在resources包下找到application.properties,将如下代码写入: spring.datasource.username=root spring.datasource.password=admin spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&cha…

2024.11.9(spring boot创建数据库)

pojo层实体类里的属性要与数据表一一对应;查询所有用户是要返回多个User,所以用List; Service层先用@Autowired注入userMapper; 然后声明方法;

django python manage.py报错TimeoutError: [WinError 10060] A connection attempt failed

diango python manage.py报错 TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 加个代理即可

4. gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

原文地址: gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器搭建环境: ubuntu: 20.04ros: Noneticsensor: robotiq_ft300gripper: robotiq_2f_140_gripperUR: UR3reasense: D435i 通过下面几篇博…

tomcat9.0下载安装及配置图文教程

下载 官网:http://tomcat.apache.org/ 选择下载64-Bit Windows zip(Win64)2.解压到任意一个盘,如,D:\apache-tomcat-9.0.98 3.设置环境变量 CATALINA_HOME:D:\apache-tomcat-9.0.98 找到系统变量Path,添加:%CATALINA_HOME%\bin验证是否配置成功 进入Windows命令行窗口,…

3. ur3+robotiq ft sensor+robotiq 2f 140+realsense d435i配置rviz,gazebo仿真环境

原文地址: ur3+robotiq ft sensor+robotiq 2f 140+realsense d435i配置rviz,gazebo仿真环境 ur3+robotiq ft sensor+robotiq 2f 140+realsense d435i配置rviz,gazebo仿真环境搭建环境: ubuntu: 20.04ros: Noneticsensor: robotiq_ft300gripper: robotiq_2f_140_gripperUR: U…

01 Java入门

1972年C诞生贴近硬件、运行极快、效率较高 操作系统、编译器、数据库、网络系统等 指针和内存管理1982年C++诞生面向对象 兼容C 图形领域、游戏等1995年Java诞生简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性Java三大版本JavaSE:标准版(桌面程序、控制…

2. ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

原文地址: ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境 ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境搭建环境: ubuntu: 20.04ros: Noneticsensor: robotiq_ft300gripper: robotiq_2f_140_gripperUR: UR3 通过上一篇博客配置好ur3、力传感器和roboti…

Git学习遇到的抽风问题记录

学习git commit和git add的区别的时候,一不小心git commit 没有加“-m”,进入了一个vim配置页面:搞了半天死活出不来,而且担心修改了不该动的东西 解决办法:输入“:”然后输入qa!//放弃任何更改并退出 解决!

咸鱼学习第一天

markdown以及编辑器obsidian的学习 1 创建新笔记Ctrl+n Ctrl+o (可以快速打开需要的笔记;可以加文档名+笔记标题)2 文档属性设置 三个“---”可以添加日期、别名、标签 3 最常用语言一个’-‘加一个空格是一个小圆点 几个“#”+一空格就是几级标题 链接设置①:如我要在…

BurpSuite实操之重发器功能使用

手动操作来触发单独的HTTP请求,并进行应用程序响应的工具,此功能用于根据不同的情况修改和发送相后的请求并分析,通过调整Request的参数,不断尝试,通过Response查看状态,从而节省在浏览器中操作的时间。 在渗透测试过程中,我们经常使用Repeater进行请求与响应的消息验证…