PTA-股票涨了吗 (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≤105,表示有N天的股价。 第二行是空格分割的N个非负整数,范围为[0,231−1],分别是每天的股价。
输出格式:
仅一行,共N个数字,分别是此前价格不低于当天且离当天最近日子的序号,以空格分隔,行末没有多余的空格。以换行结束。
输入样例:
6
4 3 10 8 8 9
输出样例:
-1 0 -1 2 3 2
思路:关键是利用每一天附带的信息,最小的大于它的那一天的位置
#include<stdio.h>
int a[100005];
int num[100005];
int main()
{
int n,i,j=1;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
if(n==1)
printf("-1");
else
printf("-1 ");
for(i=0;i<n;i++)
num[i]=-1;
for(;j<n;j++)
{
for(i=j-1;i>-1;i--)
{
if(a[i]>a[j]||a[i]==a[j])
{
num[j]=i;
break;
}
else
{
i=num[i];
i++;
}
}
}
for(i=1;i<n-1;i++)
printf("%d ",num[i]);
if(n!=1)
printf("%d",num[i]);
return 0;
}