首页 > 其他分享 >栈与队列解题报告

栈与队列解题报告

时间:2024-01-24 15:46:21浏览次数:32  
标签:const 报告 队列 tt int hh 解题 using include

刚考完试。重返oi!
这次挂掉80pts 20pts挂在T1,未考虑读的时候数字占多个字符, 60pts挂在多测未清空上。

T1

https://www.luogu.com.cn/problem/P1981
经典表达式求值。我这里采用了一种比较奇特的方法。我以每个加号为分界线。当我遍历到其中一个加号时,保证加号之前只有一个数。然后在遍历到下一个加号时,式子就是x + x * x + ,于是就可以倒着算了。
当然也可以先算乘法,最后把加法加起来。

代码

 #include <iostream>
 #include <cstdio>
 #include <algorithm>
 #include <cstring>
 
//表达式求值
//时间 40min
using namespace std;
 
const int N = 1000010;
 

char str[N];
int num[N], tt_num = -1;
int op[N], tt_op = -1;
int n;

void eval(int opretion, int a, int b)
{
	//cout << a << endl << b << opretion << endl;
	if (opretion == 1) num[ ++ tt_num] = ((a % 10000) + (b % 10000)) % 10000;
	else num[ ++ tt_num] = ((a % 10000) * (b % 10000)) % 10000;
} 

int main()
{
	cin >> str + 1;
	
	n = strlen(str + 1);
	
	int x = 0;
	for (int i = 1; i <= n; i ++ )
	{
		if ('0' <= str[i] && str[i] <= '9')
			x = x * 10 + str[i] - '0';
		else if (str[i] == '+')
		{
			num[ ++ tt_num] = x % 10000;
			x = 0; //清0 
			//只要是加法 前面必须算尽 
			while (tt_op >= 0) 
			{
				if (tt_num <= 0) break; //前面没有或者只有一个数 没必要取出算 
				int num1 = num[tt_num -- ];
				int num2 = num[tt_num -- ]; 
				eval(op[tt_op], num1, num2); 
				tt_op -- ;
			}
			op[ ++ tt_op] = 1;
		}
		else
		{
		 	op[ ++ tt_op] = 2; //乘法直接算
		 	num[ ++ tt_num] = x % 10000;
		 	x = 0; 
		}
		//这样保证了两个加直接只有乘 第一个加前面只有一个数 
	}
	num[ ++ tt_num] = x % 10000; //最后一个数哦
	
	//一定是x + x * x 的形式了
	while (tt_op >= 0) 
	{
		if (tt_num <= 0) break; //前面没有或者只有一个数 没必要取出算 
		int num1 = num[tt_num -- ];
		int num2 = num[tt_num -- ]; 
		eval(op[tt_op], num1, num2);
		tt_op -- ;
	}
	//无脑从后往前算就行 
	
	printf("%d\n", num[tt_num]);
	
	return 0;
} 

T2

https://www.luogu.com.cn/problem/P1540
这题可以直接模拟的。模拟查单词的过程,每到一个新单词,维护他的状态,如果内存有,那我们大可直接拿来用。如果内存没有。我们要先看看内存满了没,如果满了,我们要弹出,然后在加入。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

//10min

const int N = 1010;

int q[N], hh, tt = -1;
int res, m, n;
bool st[N];

int main()
{
	scanf("%d%d", &m, &n);
	
	for (int i = 1; i <= n; i ++ )
	{
		int num;
		scanf("%d", &num);
		if (st[num]) continue; //有了 
		
		if (tt - hh + 1 == m) //满了 
		{
			st[q[hh]] = false;
			hh ++ ; 
		}
		q[ ++ tt] = num;
		st[num] = true;
		res ++ ;
	}
	
	printf("%d\n", res);
	
	return 0;
}

T3

https://www.luogu.com.cn/problem/P4387

这题多测。记得清空。
我们直接一个数一个数进,我们发现。出栈当且仅当 出栈队列中的数==栈顶。并且与后面数无关,于是我们考虑不断满足出栈序列,直接模拟进栈过程,那么该出就出,最后统计答案。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

//验证栈序列 25min 

using namespace std;

const int N = 100010, INF = 0x3f3f3f3f;

int stk[N], tt = 0;
int n, m;
int in[N], out[N];

int main()
{
	scanf("%d", &m);
	while (m -- )
	{ 
	    tt = 0;
		scanf("%d", &n);
		
		for (int i = 1; i <= n; i ++ ) scanf("%d", &in[i]);
		for (int i = 1; i <= n; i ++ ) scanf("%d", &out[i]);
		//out[n + 1] = INF; //当做边界 
		int b = 0; //目前满足到出栈哪个位置了 
		for (int i = 1; i <= n; i ++ )
		{
			stk[ ++ tt] = in[i];//入栈 
			while (tt > 0 && stk[tt] == out[b + 1]) b ++ , tt -- ; //能出就出 
		}
		
		if (b >= n) puts("Yes"); //能够全部满足 
		else puts("No"); 
	}
	
	return 0; 
}

T4

单调队列板子。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

//滑动窗口 20min 
const int N = 1000010;

int q[N], hh, tt = -1;
int n, k, a[N];
 
int main()
{
	scanf("%d%d", &n, &k);
	
	//求min 
	for (int i = 1; i <= n; i ++ )
	{
		scanf("%d", &a[i]);
		while (hh <= tt && q[hh] <= i - k) hh ++ ;
		while (hh <= tt && a[q[tt]] >= a[i]) tt -- ;
		q[ ++ tt] = i;
		if (i >= k) printf("%d ", a[q[hh]]);
	}
	puts("");
	
	//求max
	hh = 0, tt = -1; 
	for (int i = 1; i <= n; i ++ )
	{
		while (hh <= tt && q[hh] <= i - k) hh ++ ;
		while (hh <= tt && a[q[tt]] <= a[i]) tt -- ;
		q[ ++ tt] = i;
		if (i >= k) printf("%d ", a[q[hh]]);
	}
	
	return 0;
}

标签:const,报告,队列,tt,int,hh,解题,using,include
From: https://www.cnblogs.com/qinyiting/p/17984814

相关文章

  • 软件单元测试报告
    ......
  • rocketmq--死信队列
    在RocketMQ中,死信队列(DeadLetterQueue,DLQ)用于存放无法成功消费的消息。当消息重试消费次数超过设定的阈值后,消息将被转移到死信队列。使用SpringBoot集成RocketMQ时,可以通过以下步骤来处理死信队列中的消息。首先,在pom.xml中添加RocketMQSpringBootStarter的依赖:<dependen......
  • app免费签名分发平台应用cdn分发平台为什么会免费?虾分发分析报告
    近年来,随着移动应用的迅速发展,免费app签名分发平台和应用CDN分发平台日益受到开发者和用户的关注。本报告旨在分析这些平台的商业模式,探讨其利润点、营销点以及所采取的优势。 一、商业模式分析:广告收入:免费app签名分发平台和应用CDN分发平台主要通过展示广告来获取收入。广......
  • 集训队论文浅读 - 信息学竞赛中构造题的常用解题方法
    抽屉原理把\(n\)个物品放入\(k\)个抽屉中,其中至少有一个抽屉中有\(\lceil\dfrac{n}{k}\rceil\)个物品,并一定有一个抽屉包含\(\lfloor\dfrac{n}{k}\rfloor\)个物品。构造题中考虑构造不同情况的抽屉,应对构造权值类问题。对于取整符号要敏感。Codeforces1450C2构......
  • 记录一下跑flink官方案例 table Api 进行实时报告
     按照官方文档下载https://github.com/apache/flink-playgrounds  flink-playgrounds代码并在idea里面打开 按照官方案例在spendReport上面加上相关代码 dockfile  echo"taskmanager.numberOfTaskSlots:30">>/opt/flink/conf/flink-conf.yaml;不然会报资......
  • 软件可行性分析报告
    ......
  • 【专题】2023年大语言模型综合评测报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33624原文出处:拓端数据部落公众号自2022年年末以来,人工智能大模型已成为技术领域甚至全球创新领域最受关注的话题。以ChatGPT为代表的大模型产品发展迅速,预测数据显示,到2030年,AIGC市场规模有望超过万亿元。2023年,国内主要厂商也相继推出自研的大语......
  • 【专题】2023年新能源汽车、智能汽车、车险行业报告汇总PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34910本文主要研究了汽车品牌的影响力以及汽车行业的营销新增量。通过调研新能源汽车及用户需求、特点和偏好,分析了中国新能源汽车市场的发展趋势和内容生态。同时,探讨了智能汽车的发展趋势、云服务和数字化人才需求。此外,还分析了中国汽车出海、新......
  • 【专题】中国中小企业数字化转型研究报告(2022)PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33471数字化转型指数报告2022合集根据“基础设施-平台-应用”三层指标体系,对全国300余个城市、10余个行业的数字化发展规模进行了评估。该报告提供了覆盖全国范围的季度数字化转型指数,为各行各业推进数字化转型提供了有益的参考。报告的评估结果可以......
  • Allure报告 03-报告Summary
    1.钩子:pytest_terminal_summary执行完测试用例后,需要对结果进行汇总,用例总数,失败用例数,成功用例数等。pytest有自带的一个钩子函数:pytest_terminal_summary,查看官方文档。#conftest.pydefpytest_terminal_summary(terminalreporter,exitstatus,config):""":......