offer收割编程赛34(股票价格3)

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN。  

小Hi想知道,对于第i天的股票价格Ai,几天之后股价会第一次超过Ai。  

假设A=[69, 73, 68, 81, 82],则对于A1=69,1天之后的股票价格就超过了A1;对于A2=73,则是2天之后股票价格才超过A2

输入

第一行包含一个整数N。  

以下N行每行包含一个整数Ai。  

对于50%的数据,1 ≤ N ≤ 1000  

对于100%的数据,1 ≤ N ≤ 100000, 1 ≤ Ai ≤ 1000000

输出

输出N行,其中第i行代表对于第i天的股票价格Ai,几天之后股价会第一次超过Ai。  

如果Ai+1~AN之内没有超过Ai,输出-1。

样例输入
5  
69  
73  
68  
81  
82
样例输出
1  
2  
1  
1  
-1

本题我首先的思路:用两个循环嵌套来求解,超时我就展示。

然后看到有时间复杂度有O(N)的思路,思考了一下·就写了出来(用堆栈)。

#include<iostream>
using namespace std;


typedef struct Node
{
int a=0,b=0;//a用来存股票值,b用来存下标。 
 }Queue;
 Queue c[200000];//作堆栈。 
 int f[200000];//读入数据 
 int d[200000];//用来保存求的天数 
 int main()
 {
  int n;
  cin>>n;
for(int j=0;j<n;j++)
cin>>f[j];
int k=0,j=0;
c[0].a=f[j];
c[0].b=j;
while(j!=n)
{
if(k==-1)
{
c[++k].a=f[j++]; 
c[k].b=j;

}
if(f[j+1]<=c[k].a)
{
k++;
c[k].a=f[j+1];
c[k].b=j+1;
j++;
}
else
{
d[c[k].b]=j+1-c[k].b;
k--;
}

}
while(k!=-1)
{
d[c[k].b]=-1;
k--;
}
 
for(int l=0;l<n;l++)
cout<<d[l]<<endl;
return 0;


 }

猜你喜欢

转载自blog.csdn.net/wxl7777/article/details/78452077
今日推荐