Peter算法小课堂—序列切割

讲序列切割之前,先来个铺垫

高手集训

题目描述:

课程表里有连续的n天可以供你选择,每天都有专题课程。其中第i天的专题趣味程度为h[i]。假设你选择了其中连续的若干天,从第l天到第r天。那么,

训练效果 = h[l]*1 + h[l+1]*2 + ... + h[r]*(r-l+1)

随着训练的深入进行,每天的趣味程度会得到更多倍数的效果。

目前有m种训练方案,每种方案由起始时间和结束时间来描述。请对每种方案输出训练效果。

算法分析

这道题目,我们可以死做,然后就会TLE。为了避免TLE,我们引入一种特殊的前缀和。

其中,s[i]为朴素的前缀和,g[i]为编号加权前缀和。

那么,上面为公式的推导。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=100009;
typedef long long ll;
ll n,m,h[N],s[N],g[N];
void input(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>h[i];
	}
}
void BF(){
	for(ll i=1;i<=m;i++){
		ll l,r;
		cin>>l>>r;
		ll ans=0;
		for(ll j=l;j<=r;++j) ans+=h[j]*(j-l+1);
		cout<<ans<<" ";
	}
}
void solve(){
	for(ll i=1;i<=n;i++){
		s[i]=s[i-1]+h[i];
		g[i]=g[i-1]+h[i]*i;
	}
	for(ll i=1;i<=m;++i){
		ll l,r;
		cin>>l>>r;
		ll ans=g[r]-g[l-1]-(s[r]-s[l-1])*(l-1);
		cout<<ans<<" ";
	}
}
int main(){
	freopen("training.in","r",stdin);
	freopen("training.out","w",stdout);
	input();
	if(n<=1000&&m<=1000) BF();
	else solve();
	return 0;
}

这里,我两种算法都放进去了。

防汛指挥

题目描述:

每年夏天,城市的河道都会经历一次汛期的挑战。你作为市长,正在紧锣密鼓的做防汛指挥工作。你所管理的城市有一条中心河道,河道的一侧容易决堤,而这一侧依次排列着n座楼房,编号1到n,其中第i座楼房高度为h[i]。目前你需要将楼房分成若干个相邻连续的区域,由各个区域内部协调防汛资源。若某个连续区域内楼房数量num达到L,则该区域中最矮的 num/L (向下取整) 座楼房会被关闭,其中人员会到区域内其他楼房暂住。若某个连续区域内楼房数量num未到达G,则该区域所有楼房都不可以关闭。通过确定分组管理的方案,本市未关闭的楼房里高度总和最小是多少?

算法分析

首先,这是一道动态规划题。AC动态规划题的心度历程:状态定义→根据样例列表格→找规律→状态转移方程→写代码

定义f[i]表示前i座楼房分组后未关闭的最小高度总和。

给出一组样例:

然后大家列一列表格

/*
f[i]表示前i座楼房分组后未关闭的最小高度总和
n=6,L=3
	i=1 ,2 ,3 ,4 ,5, 6
 h[i]=2  2  5  4  5  1
 f[i]=2  4  7  11 14 15
*/

通过找规律,我们发现

于是,我们的状态转移方程也就呼之欲出了

其中rmq()表示求最小值。

代码

/*
f[i]表示前i座楼房分组后未关闭的最小高度总和
n=6,L=3
	i=1 ,2 ,3 ,4 ,5, 6
 h[i]=2  2  5  4  5  1
 f[i]=2  4  7  11 14 15
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=100009;
ll n,L,h[N],bst[N],q[N],f[N],s[N];
void RMQ(){
	int l=0,r=0;
	for(int i=1;i<=n;i++){
		while(l<r&&i-q[l]>=L) l++;
		while(l<r&&h[i]<h[q[r-1]]) r--;
		q[r++]=i;
		bst[i]=h[q[l]];
	}
}
int main(){
	freopen("flood.in","r",stdin);
	freopen("flood.out","w",stdout);
	cin>>n>>L;
	for(int i=1;i<=n;i++) cin>>h[i];
	for(int i=1;i<=n;i++) s[i]=s[i-1]+h[i];
	RMQ();
	for(int i=1;i<=n;i++){
		if(i<L) f[i]=s[i];
		else f[i]=min(f[i-1]+h[i],f[i-L]+s[i]-s[i-L]-bst[i]);
	}
	cout<<f[n]<<endl;
	return 0;
}

结束

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RS2105XN功能和参数介绍及PDF资料

RS2105XN 品牌: RUNIC(润石) 封装: MSOP-10 开关电路: 单刀双掷(SPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通时间(Tonmax): 50ns RS2105XN是一款模拟开关芯片。以下是RS2105XN的功能和参数介绍&#xff1a; 功能&#xff1a; 2通道单刀双掷&#xff08;SPDT&#xff09;模拟开关…

抱怨无用,行动破局

故事的开始 这个专栏&#xff0c;以及本文的目的&#xff0c;是为了记录我从创立盘多啦这个平台开始&#xff0c;到后续的发展历程的专栏。同时也是给自己一个坚持的动力和警醒的作用。 首先&#xff0c;我是一名程序员&#xff0c;并且对于自身感兴趣的东西&#xff0c;都有…

使用Git管理github的代码库-上

1、下载安装Git https://download.csdn.net/download/notfindjob/11451730?spm1001.2014.3001.5503 2、注册一个github的账号&#xff08;已经注册的&#xff0c;可略过这一步&#xff09; 3、打开git命令行&#xff0c;配置github账号 git config --global user.name &quo…

自动化测试需知的4项测试工具

一般来说学自动化会建议大家先学selenium&#xff0c;因为最早的时候&#xff0c;自动化就代表selenium&#xff0c;进入测试行业就开始做接口测试&#xff0c;而且现在基本每个公司都需要接口测试。今天就和大家聊一下接口测试的工具。 一、Robot Framework 机器人框架。之所…

Bean的生命周期与循环依赖

如有不对的地方&#xff0c;还请大佬指正 Bean生命周期 扫描类 得到 BeanDefinition(包含bean的class等属性值) 后在BeanFactoryPostProcessor对bean实例化之前对Bean的元数据进行操作&#xff0c;修改Bean的属性值、添加自定义的BeanDefinition 实例化非懒加载单例bean1. …

秋招算法题——怪盗基德的滑翔翼

文章目录 题目描述思路分析思维误区 实现代码思路总结 题目描述 思路分析 注意点 只能从高到低方向一旦选择了&#xff0c;就确定了 问题转换 一旦确定了方向和起点后&#xff0c;就变为求以出发点为结尾的最长上升子序列是多少相当于同时确定两遍最长上升子序列&#xff0…

【python】模块与包

Python中的模块和包是组织和管理代码的重要工具。通过模块和包&#xff0c;你可以更好地管理和重用你的代码&#xff0c;使得代码更加模块化和可维护。 目录 前言 正文 一、模块 1、模块的分类 1&#xff09;内置模块 python解释器中默认拥有的模块可以直接使用&#xff08;…

力扣HOT100 - 70. 爬楼梯

解题思路&#xff1a; 动态规划 注意 if 判断和 for 循环 class Solution {public int climbStairs(int n) {if (n < 2) return n;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for (int i 3; i < n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }

Maven 自动化构建

优质博文&#xff1a;IT-BLOG-CN 一、Maven&#xff1a;是一款服务于 Java平台的自动化构建工具 【1】Maven可以将一个项目按模块划分成不同的工程&#xff0c;利于分工协作; 【2】Maven可以将 jar包保存在自己的中央“仓库”中进行统一管理&#xff0c;有需要使用的工程引用这…

深入探究MySQL常用的存储引擎

前言 MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;它支持多种存储引擎。存储引擎决定了MySQL数据库如何存储、检索和管理数据。不同的存储引擎具有不同的特点、性能表现和适用场景。选择适合的存储引擎对于优化数据库性能、确保数据完整性和安全性至关重要。本…

Pytorch基础:torch.cuda.set_device函数

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 torch.cuda.set_device函数用于设置当前使用的cuda设备&#xff0c;在当拥有多个可用的GPU且能被pytorch识别的cuda设备情况下&#xff08;环境变量CUDA_VISIBLE_…

全域运营是割韭菜吗?看完再下结论!

随着流量时代的到来&#xff0c;各大公私域平台中的流量争夺战日益激烈&#xff0c;商家和品牌实现流量变现的难度值也不断提高&#xff0c;运营人员的压力也逐渐增大。在此背景下&#xff0c;全域运营的兴起或许是一个契机&#xff0c;能够将所有人从内卷的状态中解救出来。而…

深度解析循环购模式:让消费更有价值

大家好&#xff0c;我是吴军&#xff0c;今天我非常高兴能和大家分享一个充满活力和创新的商业模式——循环购模式。可能大家都听过消费达到一定金额就有现金返还的活动&#xff0c;但这种返还通常都伴随着各种条件和限制。而循环购模式&#xff0c;它不仅仅是一个简单的返利机…

三丰云免费虚拟主机与免费云服务器评测

三丰云是一家知名的云计算服务提供商&#xff0c;提供免费虚拟主机和免费云服务器的服务。今天我们就来为大家介绍一下三丰云的免费虚拟主机和免费云服务器的使用体验。首先&#xff0c;让我们来看看三丰云的免费虚拟主机服务。三丰云的免费虚拟主机提供了稳定可靠的空间和带宽…

电子学会C/C++编程等级考试2024年03月(八级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示) Bob and Alice 过去住在城市 1.在注意到Alice在他们过去喜欢玩的纸牌游戏中作弊后,Bob和她分手…

美股开户,你需要知道这些!

想投资美股&#xff0c;却不知道开户需要多少钱&#xff1f; 别担心&#xff0c;这篇专栏将告诉你美股开户的资金要求以及相关注意事项。 1. 美股开户需要多少钱&#xff1f; 答案是&#xff1a;有的&#xff0c;但门槛并不高。不同平台对开户资金的要求有所不同&#xff0c;一…

Java JVM 浅析

为什么要有JVMJVM是什么&#xff1f;JVM的工作流程和组成部分JVM规范和JVM实现JVM原理详解 带着以上问题&#xff0c;我将尝试对JVM作出一些简单的介绍。 一、JVM 简介 在90年代初&#xff0c;软件开发面临一个大问题&#xff0c;即不同的操作系统和硬件架构要求开发不同的版本…

etcd集群恢复、单节点恢复操作手册

一、集群备份 备份方式&#xff1a;Jenkins触发每小时的定时任务&#xff0c;通过调取ansible的playbook进行etcd集群的数据备份和上传&#xff0c;默认只备份集群中的非leader成员&#xff0c;避免leader成员压力过大。将备份数据上传到对应的公有云对象存储&#xff0c;分别…

Flink 算子

Flink 算子 用户通过算子能将一个或多个 DataStream 转换成新的 DataStream&#xff0c;在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑。 这部分内容将描述 Flink DataStream API 中基本的数据转换 API&#xff0c;数据转换后各种数据分区方式&#xff0c;以…

Excel 两层分类后的行转列

例题描述 Excel 文件中有下图所示的数据&#xff0c;同 Name 的物品可能有多种颜色。 现在想要把数据列出下图的形式&#xff0c;每种Type一行&#xff0c;其后依次列出每种Name及其Color。 实现方法 使用 Excel 插件 SPL XLL 在空白单元格写入公式&#xff1a; spl("…