7-108 股票涨了吗 (20分)
马克吐温曾说:“10月,这是炒股最危险的月份;其他危险的月份有7月、1月、9月、4月、11月、5月、3月、6月、12月、8月和2月。"然而股票是那么的迷人,总有韭菜前仆后继的加入,并且有无数的韭菜自命不凡,想要从不可捉摸的市场中捕获出一些有趣的信息。
韭菜小CC在观察A股许多天后,终于下手买了一只走势优异、老板下周的回国的股票——乐视网(300104.SZ)。在入手之后,股价涨涨跌跌,老板却没有回国。股票好不容易涨了起来,却又跌了下去,又回到了几天前,这段时间便没有任何收益。现在,小CC想要知道以往离今天最近的且股价不低于今天的日子,看一看自己浪费了多少时间。
给出N天的股票价格,对每一天,分别输出此前价格不低于当天且离当天最近的日子(序号从0开始),如果不存在,则输出-1。
例如,连续6天的股价依次是4,3,10,8,8,9。
第0天前没有信息,因此输出−1;
第1天的价格是3,而第0天价格是4,不低于它且离它最近,因此输出0;
第2天的价格是10,此前没有不低于它的价格,因此输出是−1;
第5天的价格是9,第4天价格是8,低于它,因此继续向前看,第3天价格是8,同样低于,继续向前查找,直到第2天价格为10,不低于它,因此输出2。
综上,不低于当天且离当天最近的日子的序号分别是第−1,0,−1,2,3,2日。
输入格式:
第一行是正整数N≤10
5
,表示有N天的股价。 第二行是空格分割的N个非负整数,范围为[0,2
31
−1],分别是每天的股价。
输出格式:
仅一行,共N个数字,分别是此前价格不低于当天且离当天最近日子的序号,以空格分隔,行末没有多余的空格。以换行结束。
输入样例:
6
4 3 10 8 8 9
输出样例:
-1 0 -1 2 3 2
#include<bits/stdc++.h>
using namespace std;
int d[100009],book[100009];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>d[i];
book[0]=-1;
for(int i=1;i<n;i++){
book[i]=-1;//初始化最高
for(int j=i-1;j>=0;j--){
if(d[j]>=d[i]){
book[i]=j;//当前价格不低于当天且离当天最近日子的下标
break;
}
else {
j=book[j];//else 跳到这个日子的book记录
j++;//为了抵消j-- 进行比较
}
}
}
cout<<book[0];
for(int i=1;i<n;i++)cout<<" "<<book[i];
return 0;
}