2024/12/14课堂记录

news/2024/12/21 19:01:53/文章来源:https://www.cnblogs.com/yongshao/p/18607326

今天是我生日!!!

目录

  1. 扫描
  2. 烽火传递
  3. 最大连续和(作业)

  • 扫描

单调队列模板题

先上代码
 #include<iostream>
using namespace std;int a[2000010],q[2000010];
int main() 
{int n,k;cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];int h=0,t=0;//队尾在前面跑,对头在后面追for(int i=1;i<=n;i++){while(h<t&&q[h]+k<=i)h++;//木板不够长,被迫丢掉while(h<t&&a[q[t-1]]<a[i])t--;//新来的更大,比他小的全踹掉q[t++]=i;//新来一个if(i>=k)cout<<a[q[h]]<<"\n";}return 0;
}

理解不了就大暴力自己当机器循环走一遍,就懂了

5 3
1 5 3 4 2

n=5,k=3;

a[]={0,1,5,3,4,2};

h=0,t=0;

for

i=1:h==t,X||h==t,X||q[0]=1,t=1||1<3,X;                                       从这可以看出队尾入队(新来的)

i=2:0<1,1+3>2,X||0<1,1<5:t=0||q[0]=2,t=1||2<3,X;                  从这可以看出新来的踹掉以前的

i=3:0<1,2+3>3,X||0<1,5>3,X||q[1]=3,t=2||3=3:cout<<5;             从这里可以看出新来的没实力,踹不掉以前的

i=4:0<2,2+3>4,X||0<2,3<4:t=1||q[1]=4,t=2||4>3:cout<<5;          从这里可以看出输出的是最前头的

i=5:0<2,2+3==5:h=1||1<2,4>2,X||q[2]=5,t=3||5>3:cout<<4;        从这里可以看出木板不够长丢掉前面的


  • 烽火传递(dp)

一种方法是dp

前m个一步到位,直接点亮

后面的就是前面m个中,最小值+他的消费

注意下:最后m个有一个亮就行,不一定是最后一个亮

代码比较简单
 #include<iostream>
using namespace std;
int dp[201005],a[201005];
int n,m,ans=0x3f3f3f3f;
//  dp[i]: 表示前i个烽火台中,必须包含第i个烽火台的总最小代价 
//  dp[i]=min(dp[j]+a[i]);    i-m<=j<=i-1  
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=m;i++)dp[i]=a[i];//前m个烽火台一步到位 for(int i=m+1;i<=n;i++){dp[i]=0x3f3f3f3f; for(int j=i-1;j>=i-m;j--)//循环所有能够一步到i的烽火台 dp[i]=min(dp[i],dp[j]+a[i]);} for(int i=n-m+1;i<=n;i++)ans=min(ans,dp[i]);//最后m个烽火台只要有一个亮就行 cout<<ans<<endl;return 0;
}

这个dp其实可以用单调队列优化

如何看是否用单调队列优化?

首先明确,单调队列是用来优化dp的

且优化的要求是:状态转移方程能写成f[i]=min/max(g(j))+a[i]的形式

如本题:dp[i]=min(dp[i],dp[j]+a[i]);

接下来用到数组模拟队列(但是双端队列):q[]

q里面存的是下标,dp[q[]]

保证q里面存的下标是递增的

而dp[q[]]里边存的初始数据是递增或递减,取决于刚才写的状态转移方程到底是max还是min

具体的套路还是直接看代码吧
 #include<iostream>
using namespace std;
int dp[201005],a[201005];
int q[201005];
int n,m,ans=0x3f3f3f3f;
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];//for(int i=1;i<=m;i++)dp[i]=a[i];试用单调队列优化直接从头开始,这步不需要了 //----------单调队列优化模板--------------- int l=0,r=0; for(int i=1;i<=n;i++)//从头开始 {while(l<r&&i-q[l]>m)l++;//第一步:长度过长越界时强制丢掉队头 dp[i]=dp[q[l]]+a[i];//第二步:dp[i]=min(dp[i],dp[j]+a[i]) (稍作修改) ,计算dp(可省略) //第三步:如果队尾大于(有的题如“扫描”是小于)当前的值,那么把队尾元素删除,保证序列递减 (递增) while(l<r&&dp[q[r]]>dp[i])r--;q[++r]=i;//第四步:每次循环入栈一个 } //------------------------------------------for(int i=n-m+1;i<=n;i++)ans=min(ans,dp[i]);cout<<ans<<endl;return 0;
}

  • 作业:最大连续和

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

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

相关文章

AutoCAD VBA 模态窗口焦点丢失的终极解决办法

话不多说上代码 问题出在userform这个窗体的样式上需要用到的win32api函数以及常量Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Public Const…

数值计算方法(1) 插值方法

+++ date = 2024-12-21T10:12:41+08:00 draft = true title = 数值计算方法(1) 插值方法 +++ 初次发布于我的个人文档 之前有一期简单介绍了一下拉格朗日插值和数值积分微分方法,我感觉有点太简单了。所以这次打算开个系列,好好唠一唠。 什么是插值 在小学阶段,有一种题目叫…

Antdesign React之API展示页面

本项目基于antdesignpro,点击调试后跳转弹窗,左边展示public/doc路径下的md文档并且通过markdownview渲染成md,右侧是json编辑器index.tsx import React, { useState, useMemo } from react; import { Layout, Menu, theme, Row, Col } from antd; import { HomeOutlined, F…

时间复杂度:理解算法性能的核心指标

在编程和算法设计中,时间复杂度是一个至关重要的概念。它用来衡量一个算法在处理不同规模的输入数据时,执行所需要的时间增长速度。换句话说,时间复杂度能够帮助我们理解算法在面对大数据时的表现,是否能高效地完成任务。 什么是时间复杂度? 时间复杂度是一个描述算法效率…

TIA环境下SCL编程练习:产生m到n之间的随机整数,存入数组

假设需要读取100个随机数,存入有100个成员的数组。做这个练习是为了学习一下SCL编程。随机数使用系统时钟纳秒数来线性转换。 新建项目,选用1500PLC(6ES7 513-1AL02-0AB0,当然可以选用其它型号),设定本地时区,建立网络。 新建DB,建立变量,取消优化块的访问。 新建FC,…

大学微积分 AB 第六单元:变革的整合与积累(定积分、黎曼近似)

积分学简介 定积分简介 例子: 示例:变化的积累 1/2是面积的一半 例子:

实验六 C++

任务四: Vector.hpp:#pragma once #ifndef VECTOR_HPP #define VECTOR_HPP#include <iostream> #include <stdexcept> // 为异常类提供支持 #include <memory> // 为 std::unique_ptr 提供支持template <typename T> class Vector { private:std::…

道阻且长——2024秋软工实践个人总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标 回顾自己的软工实践课程学号 102201120道阻且长——2024秋软工实践个人总结 一、学期回顾 1.1 想象与实际 开课之…

【Rive】Rive在Android上的简单应用

1 前言 ​ Rive 是一款强大的矢量图编辑器,可以设计图形、也可以制作动画。Rive 提供了矩形、圆形、三角形、多边形、星形、钢笔、文字等工具来绘制各式各样的矢量图形;提供了平移、旋转、缩放等工具对矢量图形进行各种变换;提供了骨骼、约束、时间线、状态机、过渡条件、…

UML之类与类图

在所有项目中,类都是最常见的UML模型元素(当然,不可否认,很多项目还没画出类图就直接进入编码实现的阶段了)。类是UML模型与具体实现代码之间的桥梁,随着对UML建模的深入了解,我们也会发现,类(确切说是分析类)其实也是一些模型之间的桥梁。 在真实世界中不同对象通过…

Linux学习笔记(二) vi/vim快速入门

Linux系统会内置vi文本编辑器。 vim具有程序编辑的能力,可以看作是vi的增强版本,可以主动的以字体颜色辨别语法的正确性, 方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 下面将介绍: 1.vim打开或创建文件的方法。 2.vim的三种工…

Z-BlogPHP 安装步骤

解压程序代码将下载的 Z-BlogPHP 压缩包解压到你的网站根目录,例如 /home/wwwroot/example.com/。访问安装页面打开浏览器,访问你的网站地址,例如 http://example.com/。 会自动跳转到安装页面 http://example.com/zb_install/index.php。填写安装信息在安装页面中输入以下信…