厦门理工OJ 1271--技术流

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


你可能感兴趣的:(数据结构与算法,算法,oj系统,c++,c语言,数学)