1. 程式人生 > >offer收割程式設計賽34(股票價格3)

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;


 }