2017 山东 NOIP 小学组复赛试题2——股票难题

股票难题

【问题描述】

这些日子乔治一直在研究股票,经过调研,他终于发现了某公司股票的规
律。更可喜的是,乔治能推算出这家公司每天的股价,为了防止别人发现他的
秘密,他决定对于这家公司的股票最多买入、卖出各一次。现在他已经将股票
价格列了出来,根据股票价格表,你能算出乔治的每股股票最多能赚多少钱吗?

【输入】

输入文件名为 stock.in。
输入文件的第一行,一个正整数 n,表示天数;
第二行,用空格隔开的 n 个正整数,依次表示 n 天中每股股票的价格。

【输出】

输出文件名为 stock.out。
输出文件只有一行,一个整数,表示每股最多赚多少钱。

【输入输出样例】

stock.in stock.out
4
947 267 359 771
504

【样例说明】

第 2 天买入,第 4 天卖出,赚得 771-267=504。

【数据范围】

对于 30%的数据:n<=1000;
对于 60%的数据:n<=10000;
对于 100%的数据:n<=1000000;
对于 100%的数据:股票价格不超过 1000000000。

题目分析

本题需要找出最合适的买股票策略,让乔治赚到最多的钱。这是一个比较简单的贪心题目,需要找到最优的一个解决方案,如果在前面的数据中找到一个最小值,在后面的数据中找到一个最大值,就能帮助乔治赚到最多的钱。

代码如下

#include
using namespace std;
int a[1000005];
int main(){	
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];	
	}
	int mx=0,mn=1000000000,k;
	//枚举出前面的所有数据
	for(int i=1;i<=n-1;i++){
		int f=1;//假设没有找到最小值
		if(mn>a[i]){
			mn=min(mn,a[i]);
			k=i;
			f=0;//已经找到前面数据中的最小值
		}
		if(f==0){
			//从后面的数据中找到一个与最小值相差最大的值(比最小值大)
			for(int j=k+1;j<=n;j++){
				mx=max(mx,a[j]-a[k]);//记录模拟过程中的最大跨度
			}
		}	
	}
	cout<

你可能感兴趣的:(算法,c++,信息学奥赛)