【ACM】—蓝桥杯大一暑期集训Day2

news2024/11/18 1:23:33

🚀欢迎来到本文🚀
🍉个人简介:陈童学哦,目前正在学习C/C++、Java、算法等方向,一个正在慢慢前行的普通人。
🏀系列专栏:陈童学的日记
💡其他专栏:C++STL,感兴趣小伙伴可以了解一下哦
🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​
⛱️万物随心起,心动则万物动🤺

在这里插入图片描述

Day2集训

  • 前言
  • A - 表达式的转换
    • 解题思路
    • 示例代码
  • B - Look Up S
    • 解题思路
    • 示例代码
  • C - ICPC Balloons
    • 解题思路
    • 示例代码
  • D - Rudolph and Cut the Rope
    • 解题思路
    • 示例代码
  • E - 后缀表达式
    • 解题思路
    • 示例代码
  • F - Pashmak and Flowers
    • 解题思路
    • 示例代码
  • 总结

前言

因参加了我校的ACM暑期集训为之后的xcpc等赛事做准备,所以就有了此文哈哈。本文主要复盘做题的过程以及一些感悟,便于复习巩固。辣么现在废话也不多说啦,直接往下看吧哈哈。

A - 表达式的转换

来源:洛谷P1175 表达式的转换
在这里插入图片描述
在这里插入图片描述

解题思路

本题是道用栈实现后缀表达式模拟题,但是实现过程还是有点复杂的,好家伙第一题就给我上难度是吧。
主要的就是注意下()以及2^ 2 ^ 3的是从后往前计算的。我自己刚开始是没做出来的,我看了题解的哈哈。

示例代码

#include <bits/stdc++.h>
using namespace std;
stack<char> s1,s2;
stack<int> s3,s4;
int judge1(char c)
{
	switch(c)
	{
		case '+':return 1;
		case '-':return 1;
		case '*':return 2;
		case '/':return 2;
		case '^':return 3;
		case '(':return 0;
		case ')':return 0;
		default:return -1;
	}
}
int judge2(int x,int y,char t)
{
	switch(t)
	{
		case '+':return x+y;
		case '-':return x-y;
		case '*':return x*y;
		case '/':return x/y;
		case '^':return pow(x,y);
		default:return -0x3f3f3f3f;
	}
}
void change(string s)
{
	int len=s.size();
	for(int i=0;i<len;i++)
	{
		if(isdigit(s[i]))
			s1.push(s[i]);
		else if(s[i]=='(')
			s2.push(s[i]);
		else if(s[i]==')')
		{
			char t=s2.top();
			while(t!='(')
			{
				s2.pop();
				s1.push(t);
				t=s2.top();
			}
			s2.pop();
		}
		else if(judge1(s[i])>=1&&judge1(s[i])<=3)
		{
			if(!s2.empty())
			{
				char t=s2.top();
				while(!s2.empty()&&judge1(s[i])<=judge1(t))
				{
					if(judge1(s[i])==judge1(t)&&s[i]=='^')
						break;
					s2.pop();
					s1.push(t);
					if(!s2.empty())
						t=s2.top();
				}
			}
			s2.push(s[i]);
		}
	}
	while(!s2.empty())
	{
		char t=s2.top();
		s2.pop();
		s1.push(t);
	}
	while(!s1.empty())
	{
		char t=s1.top();
		s1.pop();
		s2.push(t);
	}
	while(!s2.empty())
	{
		char t=s2.top();
		cout<<t<<' ';
		s2.pop();
		s1.push(t);
	}
	cout<<endl;
}
void calc()
{
	while(!s1.empty())
	{
		char t=s1.top();
		s1.pop();
		s2.push(t);
	}
	while(!s2.empty())
	{
		char t=s2.top();
		s2.pop();
		if(isdigit(t))
			s3.push(t-'0');
		else
		{
			int x=s3.top();
			s3.pop();
			int y=s3.top();
			s3.pop();
			s3.push(judge2(y,x,t));//传参数时要把x和y反过来
			while(!s3.empty())
			{
				int t=s3.top();
				s3.pop();
				s4.push(t); 
			}
			while(!s4.empty())
			{
				int t=s4.top();
				cout<<t<<' ';
				s4.pop();
				s3.push(t);
			}
			while(!s2.empty())
			{
				char t=s2.top();
				cout<<t<<' ';
				s2.pop();
				s1.push(t);
			}
			while(!s1.empty())
			{
				char t=s1.top();
				s1.pop();
				s2.push(t);
			}
			cout<<endl;
		}
	}
}
int main()
{
	string s;
	cin>>s;   
	change(s);
	calc();
	return 0;
}

B - Look Up S

来源:洛谷P2947 [USACO09MAR] Look Up S
在这里插入图片描述
在这里插入图片描述

解题思路

本题可以用单调栈的思想解决,我这里用的是一种倒序递归的方法来优化时间的(学一位大佬的哈哈)。

示例代码

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100010;
int n,t=1;
int a[N],b[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=n-1;i>=1;i--){
		int j=i+1;
		while(a[i]>=a[j]&&a[j]>0)
			j=b[j];
		b[i]=j;
	}
	for(int i=1;i<=n;i++)
		cout<<b[i]<<endl;
	
}

C - ICPC Balloons

来源:t CodeForces-1703B. ICPC Balloons
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路

本题暴力模拟一下就OK啦

示例代码

#include<bits/stdc++.h>
using namespace std;
int t,n,ans=0;
char c;
int main(){
	cin>>t;
	while(t--){
		int s[100005]={0};
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>c;
			if(s[c]==0){
				s[c]=1;
				ans+=2;
			} 
				
			else
				ans+=1;
		}
		cout<<ans<<endl;
		ans=0;
	}
}

D - Rudolph and Cut the Rope

来源:CodeForces - 1846A. Rudolph and Cut the Rope

在这里插入图片描述
在这里插入图片描述

解题思路

本题其实是道简单的模拟题,主要是能理解题意,题目的意思是所有的钉子都绑了不同的绳子一段,而这些不同绳子的另一端都绑了同一颗糖果,而想要这颗糖果落地的话,只需剪掉比绳子长度比钉子高度小的即可。

示例代码

#include <bits/stdc++.h>
using namespace std;
int t;
int n,a,b,ans;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a>> b;
            if(a>b) 
				ans++;
        }
        cout < ans<< endl;
        ans=0;
    }
}

E - 后缀表达式

来源:洛谷P1449 后缀表达式
在这里插入图片描述
在这里插入图片描述

解题思路

本题又是道后缀表达式的题,我们用数组来模拟栈。

示例代码

#include<iostream>
#include<cstdio>
using namespace std;
long long s[1005];
long long i=0,a=0;
char c;
int main(){
	while((c=getchar())!='@'){
		if(c>='0'&&c<='9'){
			a*=10;
			a+=c-'0';
		}else if(c=='.'){
			s[++i]=a;
			a=0;
		}else if(c=='+'){
			s[i-1]=s[i-1]+s[i];
			s[i]=0;
			i--;
		}else if(c=='-'){
			s[i-1]=s[i-1]-s[i];
			s[i]=0;
			i--;
		}else if(c=='*'){
			s[i-1]=s[i-1]*s[i];
			s[i]=0;
			i--;
		}else if(c=='/'){
			s[i-1]=s[i-1]/s[i];
			s[i]=0;
			i--;
		}
	}
	cout<<s[1]<<endl;
}

F - Pashmak and Flowers

来源:CodeForces - 459B. Pashmak and Flowers
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

解题思路

本题模拟走一遍便输入边找最大值、最大值个数、最小值、最小值个数就好了,注意特殊情况最大值最小值相同时的处理就好啦。

示例代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f,N=500005;
ll n,x,y,maxn=-1,minn=INF,a[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]==maxn)
			x++;
		if(a[i]>maxn){
			maxn=a[i];
			x=1;
		}
		if(a[i]==minn)
			y++;
		if(a[i]<minn){
			minn=a[i];
			y=1;
		}		
	}
	if(maxn==minn)
		cout<<0<<" "<<n*(n-1)/2<<endl; //相同时双方是一样的所以需除以2
	else
		cout<<maxn-minn<<" "<<x*y<<endl;  //正常情况正常输出
}

总结

Day2的题主要考察的也是一些基础的算法,有些稍复杂。
算法:单调栈、线性结构、模拟、暴力
感悟:这些算法算也是较基础的,但还需多加练习达到更快解题
总结:每个算法都有其巧妙处,一些模拟题也是较为繁琐很是考察逻辑思维的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10秒搞定!教你如何轻松压缩jpg格式图片大小!

大家在日常拍照时&#xff0c;都会发现拍摄出来的JPG图片体积比较大&#xff0c;使用和保存时都会比较麻烦。那么该怎样压缩图片大小呢&#xff1f; 首先&#xff0c;我们需要了解什么是JPG压缩。JPG是一种有损压缩格式&#xff0c;通过减少图像中的信息量来使文件大小缩小。使…

Java实现多文件上传及进度条提示-源码下载

1、方案概述 1、案例框架使用的是springmvc5.3.16版本,jackson使用的是2.13.3版本。 2、前端使用的是Layui2.8.11框架,这个框架上手较为容易。 3、使用关键类CommonsMultipartResolver和MultipartHttpServletRequest实现多文件捕获。 2、效果预览 【选择文件】 【上传过…

Android JNI线程的同步 (十三)

🔥 Android Studio 版本 🔥 🔥 了解线程同步的两个变量 🔥 pthread_mutex_t 互斥锁 线程的互斥: 目前存在两个线程 , 线程A和线程B, 只允许只有一个资源对临界资源进程操作 (大概意思就是 : A线程 进入操作临界资源的时候 , 那么 B线程 就要进行等待 . 等到 A线程…

感受C++模版的所带来的魅力,扎实基础,扩展思维

一、泛型编程思想 首先我们来看一下下面这三个函数&#xff0c;如果学习过了 C函数重载 和 C引用 的话&#xff0c;就可以知道下面这三个函数是可以共存的&#xff0c;而且传值会很方便void Swap(int& left, int& right) {int temp left;left right;right temp; } …

Nuxt.js--》解密Nuxt.js:构建优雅、高效的现代化Vue.js应用

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…

【C++】Eigen库实现最小二乘拟合

前言 入职第二周的任务是将导师的Python代码C化&#xff0c;发现Python中存在Numpy包直接调用np.polyfit就好了&#xff0c;但是C不存在需要造轮子。 #include <iostream> #include <cmath> #include <vector> #include <Eigen/QR> #include "x…

re学习(15)BUUCTF 2019红帽杯easyRe(寻找数据+xor问题)

参考视频&#xff1a; 【BUUCTF】每天一个CTF11“2019红帽杯easyRe”_哔哩哔哩_bilibili &#xff08;本人觉得看视频比看博客效率能提高十倍&#xff0c;呜呜呜&#xff0c;还是视频香~~~与君共勉&#xff09; 下载地址&#xff1a; BUUCTF在线评测 前言&#xff1a;虽然…

Spring Boot集成Redisson实现分布式锁

Spring Boot集成Redisson实现分布式锁 在分布式系统中&#xff0c;为保证数据的一致性和并发访问的安全性&#xff0c;我们经常会使用分布式锁来协调多个节点之间对共享资源的访问。Redisson是一个基于Redis的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;和…

【C++】string类模拟

文章目录 成员变量和查看接口迭代器&#xff08;读和读写&#xff09;operator[]&#xff08;读和读写&#xff09;c_str()size() 构造函数用字符串构造用对象构造&#xff08;两种方法&#xff09;析构 赋值运算符重载扩容和调整reserve()resize()clear() 增删查改push_back()…

C++的switch函数用法

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case&#xff0c;且被测试的变量会对每个 switch case 进行检查。 语法 C 中 switch 语句的语法&#xff1a; switch(expression){ case constant-expression : statement(s); break; // 可选的 case c…

Redis数据类型 — Zset

目录 Zset内部设计 跳表哈希表 ZipList ZSet中每一个元素都需要指定一个score值和member值&#xff1a;<1> 可以根据score值排序后<2> member必须唯一<3> 可以根据member查询分数 Zset内部设计 因此&#xff0c;zset底层数据结构必须满足键值存储、键必…

AutoCAD如何通过C#进行插件开发?

文章目录 0.引言1.开发工具准备2.VS&#xff08;C#&#xff09;创建插件3.使用插件 0.引言 AutoCAD是一款广泛应用于工程设计和建筑行业的计算机辅助设计软件。通过使用C#语言进行插件开发&#xff0c;可以扩展AutoCAD的功能&#xff0c;实现定制化的需求。插件可以实现自动化绘…

linux之Ubuntu系列(-)

单用户和多用户 注意事项 Linux 系统 中区分大小写的 Window 系统 不分区大小写的

1.Java语言概述

1.1概述 JDK(Java development kit)java开发工具包 JDK是提供Java开发人员使用的&#xff0c;其中包含java的开发工具&#xff0c;包括JRE,所以安装JDK&#xff0c;就不需要安装JRE了 其中编译工具javac.exe、打包工具jar.exe JRE(Java Runtime environment) java运行环境 包括…

android11 input 事件 1 初始化

system_server 初始化InputManagerService // SystemServer.java private void startOtherServices(NonNull TimingsTraceAndSlog t) {t.traceBegin("startOtherServices");// 初始化InputManagerServicet.traceBegin("StartInputMana…

让机器学习不再是过门不入,带您一起详解机器学习(机器学习 Machine Learning 研习之一)

什么是机器学习&#xff08;Machine Learning&#xff09;&#xff1f; 机器学习是]赋予计算机学习能力的研究领域 无需明确编程。 ——阿瑟塞缪尔&#xff0c;1959 计算机程序可以从关于某些任务的经验 E 中学习 T 和一些绩效衡量 P&#xff0c;如果其在 T 上的绩效按 P 衡量&…

微信批量自动加好友神器,多账号如何统一自动加好友

其实这样的方式不仅太集中容易造成频繁 效率还很低 现在可以解放双手 只需要你有数据 导入数据设置相应添加任务 就可以每天根据你设置的时间点去添加好友 直到数据被用完 就不用每天手动一个个去添加咯 还可以多账号统一自动加好友 一天就可以加多点 相信 无论是个…

RDS-Tools RDS-Knight Crack

RDS 高级安全性 利用全面的网络安全工具箱中有史以来最强大的安全功能集来保护您的 RDS 基础架构。 全方位 360 保护 无与伦比的功能集 无与伦比的物有所值 企业远程桌面安全。现代工作空间的智能解决方案。 办公室正在权力下放。远程办公室和移动员工数量创历史新高。随…

Netty网络编程

参考文档 https://zhuanlan.zhihu.com/p/550956053 https://zhuanlan.zhihu.com/p/514448867 BIO 读取数据有两个阶段 等待数据就绪&#xff0c;数据到达内核缓冲区读取数据(系统调用)&#xff0c;从内核缓冲区&#xff0c;拷贝至用户缓冲区 BIO两个阶段都会阻塞 BIO编程时&…

RIS 系列 RISCLIP: Referring Image Segmentation Framework using CLIP 论文阅读笔记

RIS 系列 RISCLIP: Referring Image Segmentation Framework using CLIP 论文阅读笔记 一、Abstract二、引言三、相关工作Referring Image SegmentationVisual Grounding PretrainingContrastive Language-Image Pre-training (CLIP) 四、Referring Image Segmentation Framewo…