时间限制: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;
}