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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程实现:
太阳黑子最大数量一直增加的最长连续年数
题目描述:
太阳黑子是太阳表面因温度相对较低而显得“黑”的局部区域,一般成群出现在太阳表面,并且对地球造成很明显的影响。为此,人类根据多项科学研究追溯到几十万什前的黑子活动,并重建了数据记录。小蓝拿到了一组微据,有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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ha___。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值