当前位置:首页 > 题解目录 > 正文内容

【题解】零花钱

亿万年的星光4年前 (2021-05-01)题解目录2114

零花钱(money.cpp) 

【问题描述】 

商店里有一件玩具,今天你偶然得知:这件玩具在后⾯的n天里每天的定价(价格可能每天都会改 变),你买了这件玩具后可以以当天的价格卖给商店,所以你可以通过买卖这件玩具来赚取零花钱。如果只允许买卖一次,你怎样才能赚到最多的钱?数据保证肯定能赚到钱。

【输入描述】

第一行:⼀个正整数n,表示有n天。

第二行:a1,a2,...,an,表示这件玩具在将来n天里每天的价格,中间一个空格隔开。

【输出描述】

一个整数,最多能够赚多少零花钱。

【样例输入】

4
1 2 3 5

【样例输出】

4

【数据规模和约定】

50%的数据:0<n<=1000, 1<=a1<=a2<=...<=an<=1000;

100%的数据:0<n<=100000, 1<=a1,a2,…,an<=1000。

【题目分析】

  • 首先明白一个点,不是每天必须都要买的,某一天可以不用买。

  • 这一天过去了就不能再卖了。

  • 如果求出数组中的最大值max的下标indexMax比数组中的最小值min的下标indexMin大,那么结论就是max-min(样例中的情况)

  • 如果数组中最大值max的下标indexMax比最小值min的下标indexMin小。比如(5,6,2,1,3)这个时候就需要详细考虑了。

    (5,6,2,1,3)最大值是6,最小值是1,但是因为一天过去了就不能用昨天的价格卖出,所以多能赚的是第4天买,第5天卖,赚2元。

    那么我们就要讨论一下数据的规律,可以简单看出,数据可以分成几类,由小到大,由大到小。由大到小的没法考虑,所以我们只考虑由小到大。因为不是按照顺序由小达到,是“一段一段”的由小到大。所以可以考虑把每一段的 由小到大 的结果算出来。然后求最大或者最小。


【参考答案】

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[100000];
	int n,pmax=0,pmin=10001,indmax,indmin;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		if(pmax<a[i]){
			pmax=a[i];
			indmax=i;
		}
		if(pmin>a[i]){
			pmin=a[i];
			indmin=i;
		}
	}
	if(indmax>=indmin){
		cout<<pmax-pmin;
	}else{
		int tmpmin=10001;
		int tmpmax=0;
		for(int i=0;i<indmax;i++){  //从开始位置到最大值所在位置
			if(tmpmin>a[i]){
				tmpmin=a[i];  //找最小值
			}
		}
		
		for(int i=indmin;i<n;i++){  //从最小值所在位置到结束,
			if(tmpmax<a[i]){
				tmpmax=a[i];   //找最大值
			}
		}
		int cj=pmax-tmpmin;  //用原来的最大值减去从0到最大值下标之间的最小值
		int cj2=tmpmax-pmin; //用从最小值下标到结束之间的最大值减去原来的最小值。
		if(cj>cj2){
			cout<<cj;
		}else{
			cout<<cj2;
		}
	}
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】最大公约数(2019青岛市程序设计竞赛)

【问题描述】给定n,以及正整数序列a1,a2,…,an与b1,b2,…,bn。令:sa=a1*a2*…*ansb=b1*b2*…*bn求sa和sb的最大公约数gcd(sa,sb)。【输入】第一行n。第...

【题解】移动路线

【题目描述】X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。小明是个调皮的孩子,一...

【题解】尼科彻斯定理

【题目描述】 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。【输入描述】任一正整数【输出描述】该数的立方分解为一串连续奇数的和【样例输入】13【样例输出】13*13*...

【题解】东哥的杯子

【题解】东哥的杯子

【题目描述】话说在一场牛客练习赛中,东哥力压群雄,挣得第一,牛客为了奖励东哥的发挥,送他一个马克杯。奖励的马克杯是一个标准的圆台形状,它的上底为R1,下底为R2,高为H, 东哥向杯子里倒V毫升的水,你...

【题解】王国比赛

【题解】王国比赛

【题目描述】智慧之王 Kri 统治着一座王国。 这天 Kri 决定举行一场比赛,来检验自己大臣的智慧。 比赛由 n道判断题组成,有 m位大臣参加。现在你已经知道了所有大臣的答题情况,但尚未拿到答...

【题解】大整数减法

【题目描述】求两个大的正整数相减的差。【输入】共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。【输出】一行,即所求的差。【输入样例】9999...