首页 > 其他分享 >2024/12/14课堂记录

2024/12/14课堂记录

时间:2024-12-21 19:08:49浏览次数:4  
标签:201005 12 14 min int 2024 队列 dp cout

今天是我生日!!!

目录

  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

前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;
}

标签:201005,12,14,min,int,2024,队列,dp,cout
From: https://www.cnblogs.com/yongshao/p/18607326

相关文章

  • 道阻且长——2024秋软工实践个人总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标回顾自己的软工实践课程学号102201120道阻且长——2024秋软工实践个人总结一、学期回顾1.1......
  • 2024-2025-1 20231420《计算机基础与程序设计》第十二周助教总结
    课程答疑C语言:指针、结构体、文件C语言中,指针、结构体十分重要,也较为困难;大家刚接触文件的操作,可能比较陌生,未能掌握文件的相关操作。大家要深入学习指针、结构体、文件的相关语法,这对之后的课程也很有帮助,可以借助网络资源学习,也要多敲代码,多多练习。课程作业中出现的问题格......
  • [luoguP11233/CSP-S 2024] 染色
    题意给定一个长度为\(n\)的正整数数组\(A\),其中所有数从左至右排成一排。你需要将\(A\)中的每个数染成红色或蓝色之一,然后按如下方式计算最终得分:设\(C\)为长度为\(n\)的整数数组,对于\(A\)中的每个数\(A_i\)(\(1\leqi\leqn\)):如果\(A_i\)左侧没有与其同色的......
  • 2024-2025-1 20241413 《计算机基础与程序设计》 第十三周学习总结
    |班级链接|https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP||----|----|----||作业要求|https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13||----|----|----|教材学习内容总结《C语言程序设计》第12章结构体定义:结构体是一种用户自定......
  • 攀山小队1221模拟赛
    “冬天来了,春天还会远吗?”前言一言难尽,最耻辱的一场。赛时08:30~09:30第一次看\(A\)题的时候,以为是悬线法,没想起来悬线法怎么做就先开\(B\)了。\(B\)第一眼以为是原,敲了一个\(k\)优解背包,当时没看题面,以为必须装满,调了很久,后面发现把memset删了就过了。看了一眼......
  • 24.12.21
    回来第一场打成屎了\(\tiny-1\)A大胆猜测在\(n\)足够大时一定可以把\(y\)与成\(0\),那么就只需最大化\(x\)(NT:绿题不到)。那么\(n\)什么时候足够大呢?任取\(3\)个数,那么每一位都至少有一种消掉它的方法,因此如果现在还剩\(k\)位,就一定可以选出两个数消掉\(\lceilk/......
  • 学期:2024-2025-1 学号:20241303 《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第十三周作业)这个作业的目标<写上具体方面>加入云班课,参考本周学习资源;自学教材《C语言程序设计》第12章并完......
  • 学期2024-2025-1 学号20241424 《计算机基础与程序设计》第13周学习总结
    学期2024-2025-1学号20241424《计算机基础与程序设计》第13周学习总结作业信息|这个作业属于2024-2025-1-计算机基础与程序设计)||-- |-- ||这个作业要求在2024-2025-1计算机基础与程序设计第13周作业||这个作业的目标|<学习《C语言程序设计》第12章并完成云班课测试>||作......
  • LeetCode72. 编辑距离(2024冬季每日一题 37)
    给你两个单词word1和word2,请返回将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例1:输入:word1=“horse”,word2=“ros”输出:3解释:horse->rorse(将‘h’替换为‘r’)rorse->......
  • P1268 树的重量
    链接:https://www.luogu.com.cn/problem/P1268原题:思路:原本的思路是通过最长边构建一棵树,然后通过记录每个横坐标的值来模拟每个边的分支。但是这样做太繁琐而且容易分类讨论失误。看了题解的一个非常巧妙的办法:类似于求LCA的思路。事实上感觉就像状态转移?类似于DP里面的......