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