P10133 [USACO24JAN] Balancing Bacteria B(二阶差分)

news/2025/1/15 14:54:41/文章来源:https://www.cnblogs.com/medicos/p/18407544

题解

题目链接

P10133 [USACO24JAN] Balancing Bacteria B

题目大意

对一个数列,加上若干次从 \(N\) 的位置开始到 \(1\) 的位置,以 \(-1\) 为公差的等差数列,其中首项 \(L\) 满足 \((1≤L≤N)\),且末项到 \(0\) 即结束。求最少使用多少次这样的操作可以使得数组所有项均为 \(0\)

解题思路

\(①\) 贪心 + 维护等差数列元素
常理下思考,本题可以按照顺序依次使每个元素变为 \(0\) 。而应当以何种顺序?显然是从左到右,\(a_1\) ~ \(a_n\) 。因为要修改离右边远的,就一定会修改到离右边近的,反之则不然。
而将某个元素变为 \(0\) 的同时,修改操作也会对右边所有数造成影响,若暴力修改右边每个元素,则全部操作的总时间复杂度会到 \(O(n^2)\) ,显然是不能接受的。
该影响可以通过维护等差数列元素来 \(O(n)\) 解决。这里 \(now\) 为当前等差数列元素,\(d\) 为公差。

    long long ans = 0, now = 0, d = 0;for (int i = 1; i <= n; ++i) {now += d;a[i] += now;d -= a[i];now -= a[i];ans += abs(a[i]);}

\(②\) 二阶差分
对原数组 \(l\) ~ \(n\) 区间进行等差数列的修改,等价于对一阶差分数组 \(l\) ~ \(n\) 区间进行区间加相同值的操作,等价于对二阶差分数组 \(l\) 位置进行单点修改。因此求出二阶差分数组,并与最终全 \(0\) 二阶差分数组相比较求和即可得出答案。

    long long ans = 0;for (int i = 1; i <= n; ++i) {d[i] = a[i] - a[i - 1];d2[i] = d[i] - d[i - 1];ans += abs(d2[i]);}

完整代码

//二阶差分
#include <bits/stdc++.h>using namespace std;signed main() {ios::sync_with_stdio(0), cin.tie(0);int n;cin >> n;vector<long long> a(n + 1), d(n + 1), d2(n + 1);for (int i = 1; i <= n; ++i) cin >> a[i];long long ans = 0;for (int i = 1; i <= n; ++i) {d[i] = a[i] - a[i - 1];d2[i] = d[i] - d[i - 1];ans += abs(d2[i]);}cout << ans << "\n";return 0;
}

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

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

相关文章

定时任务执行 php think 命令脚本

查看是否有该服务, 是否正常运行 1. 编写crontab 文件。 命令: crontab -e 如下图: php 是全局安装的, 使用php 执行项目目录下的think. 命令是自定义的命令, 然后把输出写到日志文件

zliabary最新入口,zliabary国内官网镜像站网址(持续更新)

​zliabary是全球最大的电子书网站,从2009年开始提供免费的电子书,到如今已经拥有1000万多本书籍和8000万篇文章,是最大的影子图书馆,由于美国政府的屏蔽,zliabary已经从24年5月退出了国内市场,zliabary官网国内暂时登录不了。国内目前有两种可以使用zliabary方法,第一种…

软工第二次作业

软工作业2:个人项目-论文查重 GitHub链接: github 课程信息课程: 计科22级2班 - 广东工业大学 作业要求: 作业要求 目标: 完成个人项目-论文查重;学会写单元测试一、PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 60 30Es…

Pyqt5 实现多标签页面

实现功能代码实现 import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QVBoxLayout, QPushButton, QWidget, QLabel, \QDesktopWidgetclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.ini_ui()def ini_ui(self):self.se…

gitee【下载文件】

1.配置公钥(如果是新设备) ssh-keygen -t ed25519 -C "Gitee SSH Key"输入这行命令,按3次回车,演示如下: 生成的公钥就在红框文件夹下复制该字符串,进入gitee的设置中,找到公钥粘贴该字符串配置完后可用该命令测试 ssh -T [git@gitee.com](mailto:git@gitee.c…

gitee【上传文件】

1.配置公钥 ssh-keygen -t ed25519 -C "Gitee SSH Key"输入这行命令,按3次回车,演示如下: 生成的公钥就在红框文件夹下复制该字符串,进入gitee的设置中,找到公钥粘贴该字符串配置完后可用该命令测试 ssh -T [git@gitee.com](mailto:git@gitee.com)2.新建仓库并配…

【技术积累】腾讯/阿里云对象存储上传+删除

腾讯/阿里云对象存储上传+删除创建储存桶 (后面会用到 储存库名称、访问域名、以及region) region(地域和访问域名)的查询参考: https://cloud.tencent.com/document/product/436/6224 https://www.aliyun.com/product/oss常用的阿里云、腾讯云2.创建Api密钥 (后面会用到…

虚拟机安装 gho系统

1.新建 虚拟机2.使用 _优先安装WePE_64_V2.3.exe 制作一个可启动iso3.gho文件 用UltraISO 制作为一个iso文件4.虚拟机用 前面制作的iso文件启动后 分区 ,然后启动 gho工具,再加载iso文件5.此时可以进行克隆还原了

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码void MainWindow::on_pushButton_clicked() {QProcess *process = new QProcess();QString filePath = "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath = "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe…

基于tf-idf的论文查重

基于tf-idf的论文查重 github地址:https://github.com/gomevie/gomevie/tree/main这个作业属于哪个课程 广工计院计科34班软工这个作业要求在哪里 作业要求 这个作业的目标 设计并实现一个论文查重算法,通过比较原文和抄袭版论文文件,计算并输出重复率。PSP表格PSP2.1 Pers…

Java SE 语法学习

JavaSE 语法 java数据类型基本数据类型整数类型byte 占1个字节,范围:-128-127 short占2个字节,范围:-32768-32767 int占4个字节,范围:-2147483648-2147483647 long占8个字节,范围:-9223372036854775808-9223372036854775807浮点数类型double占8个字节 float占4个字节字…

今天学习和总结

学习了简单的算法知识排序中的快速排序,利用分治的思想来实现快速排序,对于前后大小有问题的进行swap的交换位置,这是基本的模版和源码 include using namespace std; define N 1000100 int A[N]; void quick_sort(int a,int b){ if(a>=b)return ; int i=a-1,j=b+1,x=A[a+b&…