1271-技术流
题目描述
Description
小明是一个股民,他最看不起身边那些靠听消息炒股的股民。他自诩自己是技术流,是靠分析股市中的技术指标实现财富的保值增值。
小明前两周已经学完了K线图和MACD指标,这几天他在主攻HH-Index( historically highest )指数,表示在最近K天内( 包含该天 ),本日股价是最高的,而在最近K+1天内,它就不是最高的。
举例,某支股票的价格走势如图。
题目限制
Time Limit:1000MS Memory Limit:65536K
输入输出规则,及其案例
Input
输入第一行为一个正整数N ( 2 < N < 100000 ), 表示有N天,编号为1到N。 接下来一行输入N个整数( 0 <= a[i] <= 100000),表示这N天的股价。Output
一行N个数,第i个数表示HH(i),以空格间隔。
Sample Input
6 8 4 3 5 6 2
Sample Output
1 1 1 3 4 1**
题目分析
- 因为股票这个是没有办法确切的知道后几天的走势的,所以题目说的最近几天都是指当天和前面的几天。
- 当天的股票走势要是比其他几天都低,输出的时候也应该是1而不是0,因为走势分析的时候是包括当天的。
思路
- 因为都是分析某一天前面的天数,所以当我们要取得那一天的HH(x)指数,应该从那一天开始,往前遍历。
- 注意走势图并不一定是单调的,可能忽高忽低。当不再是最高的指数的时候,就应该停止遍历,这点非常重要。
- 为了节省空间,可以采用动态分配内存的方法,我这里用一个整型的指针去维护我们要输入的结果。(当其实这里是没必要节省的,因为题目本身的算法并不难,所以不太需要空间换时间等操作,结果输出的部分我偷了个懒,直接定义了,如果无法通过,可以扩大一下空间,或者也采用动态指定空间的方式。)
代码实现部分
#include<iostream>
using namespace std;
int main()
{
//day是总共的天数,arr是一个维护我们输入数据的指针
//res是用来储存结果的一个数组
//i,j是用于循环的计数变量
int day, i, j, * arr, res[100] = { 0 };
cin >> day;
arr = new int[day];
for (i = 0; i < day; i++)
cin >> arr[i];
for (i = day-1; i >= 0; i--)
for (j = i; j >= 0; j--)
{
if (arr[j] <= arr[i])
res[i]++;
else
break;//这里一定要注意退出循环
//否则会出现中途有一个前某一天的指数比那一天的大,但还在计数。
}
for (i = 0; i < day; i++)
cout << res[i] << ' ';
return 0;
}