蓝桥杯2023STEMA考试C++试卷(8月)第四题

本文介绍了通过C++编程实现的算法,利用单调栈寻找太阳黑子数据中最大数量连续增长的最长年数,涉及数据处理和栈的应用。

编程实现:
太阳黑子最大数量一直增加的最长连续年数
题目描述:
太阳黑子是太阳表面因温度相对较低而显得“黑”的局部区域,一般成群出现在太阳表面,并且对地球造成很明显的影响。为此,人类根据多项科学研究追溯到几十万什前的黑子活动,并重建了数据记录。小蓝拿到了一组微据,有n个整数,表示连续N年里每一年的太阳黑子最大数量,他希望找出所有教量连续增加的记录,并计算出连续增加记录中的最长连续年数。
例如: N = 8,连续8年里太阳黑子最大数量依次是2、3、1、2、4、8、4、9,数量连续增加的记录有((2、3)、(1、2)、(1、2、4)、(1、2、4、8)、(2、4)、(2、4、8)、(4、8)和(4、9),连续增加的年数分别是2、2、3、4、2、3、2、2,其中最长连续年数为4,故最后输出4。
输入描述第一行输入一个正整数N(O<=N<=1000000),表示数据记录的年数。第二行输入I个用空格隔开的正整数(0<正整数<19),表示连续N年的太阳黑子最大数量
输出描述:输出一个非负整数,表示太阳黑子最大数量连续增加记录中的最长连续年数
样式输入:
8
2 3 1 2 4 8 4 9
样例输出:
4

解题思路:
1、本节采用了单调栈的性质,对于题目问题进行分解。
2、在2、3、1、2、4、8、4、9数据中,当出现不是递增情况时,则对分割。采用了单调递增栈。

解题程序:
1、程序定义与输入部分

	int n,max1=0;
	stack <int>s; 
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}

2、将数据按着递增规律放入栈中

    for(int i=0;i<n;i++)
	{
		s.push(a[i]);
		for(int j=i+1;j<n;j++)
		{
		  if(s.top()>a[j])
		  {
		 
		  }
		  s.push(a[j]);
		}
	
	}

3、s.top()>a[j],是当出现栈顶元素大于下一次进来的元素时,则要统计当前栈的大小,并存储对应的变量上,以及最重要的 清空栈!!!

    for(int i=0;i<n;i++)
	{
		s.push(a[i]);
		for(int j=i+1;j<n;j++)
		{
		  if(s.top()>a[j])
		  {
		  	if(max1<s.size())//统计当前栈的大小,并存储对应的变量上
		  	max1=s.size();
		  	//清空栈 
		  	while(!s.empty())//直到空栈结束
            {
             s.pop();
            }
            /////////////// 
			break;//清空完着则跳出该循环
		  }
		  s.push(a[j]);
		}
    //////////////////
	}

4、上面程序段,只是针对题目的中数据进行解决设计。如果出现 1 2 3 4 5数据或者 1 2 1 2 3的数据是存在问题。数据的特点是不存在中间或者结尾出现不是递增栈的规律这里就要补充程序段而从规避。

   if(max1<s.size())
    max1=s.size();
    //清空栈 
    while(!s.empty())
    {
        s.pop();
    }
    //////////////////

5、假设正常入栈,不存在递增栈的规律性质时,则上面的程序段时可以直接计算出栈的大小。这里要注意:每次完成入栈全部操作后,要去清空栈。以便与下次数据进行计算。
6、完成程序段如下:

#include<iostream>
#include<stack>//栈 
using namespace std;
const int N=1000000;
int a[N];
int main()
{
	int n,max1=0;
	stack <int>s; 
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++)
	{
		s.push(a[i]);
		for(int j=i+1;j<n;j++)
		{
		  if(s.top()>a[j])
		  {
		  	if(max1<s.size())
		  	max1=s.size();
		  	//清空栈 
		  	while(!s.empty())
            {
             s.pop();
            }
            /////////////// 
			break;
		  }
		  s.push(a[j]);
		}
	if(max1<s.size())
    max1=s.size();
    //清空栈 
    while(!s.empty())
    {
        s.pop();
    }
    //////////////////
	}
	cout<<max1;
}


### 蓝桥杯 202501 STEMA C++ 选择解析 关于蓝桥杯 202501 STEMAC++ 部分选择,以下是对其可能涉及的知识点以及常见目类型的分析和解答方法。 #### 基础语法与数据类型 C++ 中的基础语法和数据类型是考试中的重点之一。例如,在判断变量范围或者运算符优先级时,考生需熟悉整型、浮点型以及其他基本数据类型的特性及其存储方式[^1]。 ```cpp int a = 2147483647; // int 类型的最大值 a += 1; // 此处会发生溢出,结果变为负数 ``` #### 函数调用与参数传递 函数的定义与调用也是常考知识点。需要注意的是传值调用 (pass by value) 和传址调用 (pass by reference) 的区别。如果目中涉及到指针或引用,则更应仔细区分两者的实际效果[^2]。 ```cpp void modifyValue(int &x, int y){ x *= 2; y /= 2; } int main(){ int num1=5,num2=10; modifyValue(num1, num2); // 修改后的num1为10,而num2仍保持原值不变 } ``` #### STL容器的应用 标准模板库(STL) 是现代C++编程的重要组成部分,其中vector、map等容器类经常出现在试当中。了解这些容器的操作接口及时间复杂度对于快速解至关重要[^3]。 ```cpp #include <vector> std::vector<int> vec{1,2,3}; vec.push_back(4); // 向向量末尾添加元素 if(!vec.empty()) { std::cout << "First element:" << vec.front() << "\n"; } ``` #### 动态内存管理 动态分配内存的概念通过new/delete操作符实现,错误处理不当容易引发程序崩溃等问。因此掌握如何安全有效地释放不再使用的资源显得尤为重要[^4]。 ```cpp class MyClass{ public: ~MyClass(){ /*析构函数*/ } }; MyClass* objPtr=new MyClass(); delete objPtr;//记得销毁对象以防止泄露 objPtr=nullptr; ``` #### 多线程基础概念 随着并发计算变得越来越普遍,部分高级别的竞赛也可能考察到有关多线程方面的基础知识,比如互斥锁(mutex),条件变量(condition variable)等内容[^5]。 ```cpp #include<thread> #include<mutex> std::mutex mtx; void print_block(int n,std::string msg){ std::lock_guard<std::mutex> lock(mtx); for(int i=0;i<n;++i){std::cout<<msg;} } int main(){ std::thread t1(print_block,5,"Thread1 "); std::thread t2(print_block,5,"Thread2 "); t1.join();t2.join(); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ha___。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值