PTA 7-108 股票涨了吗 (20分) KMP

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;
	
}

猜你喜欢

转载自blog.csdn.net/Minelois/article/details/113281017