Live2d Test Env

HihoCoder1620: 股票价格3 (单调队列 or DP)

股票价格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

 之前做过很多这样的题,但是不知道归类与单调队列,还是DP

 

具体的可以看看----这几道题

 

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100010;
int a[maxn],r[maxn];
int main()
{
    int i,j,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%d",&a[i]);
    r[n]=-1;
    for(i=n-1;i>=1;i--){
        int tmp=i+1;
        while(true){
            if(tmp==-1){  r[i]=-1;  break; }
            if(a[tmp]>a[i]){ r[i]=tmp;  break; }
            tmp=r[tmp];
        }
    } 
    for(i=1;i<=n;i++) printf("%d\n",r[i]>0?r[i]-i:-1);
    return 0;
}
 

 

posted @ 2017-11-09 16:59  nimphy  阅读(200)  评论(0编辑  收藏  举报