题面
您可以从外汇保证金交易中获取利润。 例如,如果您以每美元 100 日元的价格买入 1000 美元,并以每美元 108 日元的价格卖出,则可以获得 (108 - 100) × 1000 = 8000 日元。
你需要编写一个程序,读取一种货币在 t 时刻的价值Rt,然后输出Rj−Ri的最大值(j>i)。
输入
第一行包含一个整数n(2≤n≤200000)。接下来n行,Rt(t=0,1,2,...,n−1)按顺序给出,1≤Rt≤109。
输出
在一行中输出最大值。
本题是想求解一种最大值,就是后面值减去前面值中的最大值,常规的思路就是如下所示:
#include<iostream>
#include<cmath>
#define maxn 200000
#define minn -99999
using namespace std;
int main()
{
int max=minn;
int a[maxn];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(a[i]-a[j]>=max) max=a[i]-a[j];
}
}
cout<<max<<endl;
//system("pause");
return 0;
}
就是利用for循环每次都对前面的数进行一次减法再和max值进行判断,这样的方法从原理上是可以的,但是时间复杂度非常的大,再一些N比较大的数据中就不能通过了,所以我们就要优化并且降低时间复杂度。
优化的方法也很简单,我们我们要求的是最大值,所以每次对前面的数盲目做减法肯定是不对的,正确的做法的是减去前面数的最小值,这样就很快就能获得此时的最大值,再进行比较即可。
最后我们需要注意几个点
1.首先是此时的数据比较大,用int可能会不合适,所以改用long long。
2.Max和Min的初始值一定要设置尽可能大/小,因为测试的数据也是比较大的,如果Max/Min的值设置的过小判断就会出现错误了。
AC代码如下:
#include<iostream>
#include<cmath>
#include<algorithm>
#define max1 200000
#define minn -9999999999
#define maxn 9999999999
typedef long long ll;
using namespace std;
int main()
{
ll Max=minn;
ll Min=maxn;
ll a[max1];
ll n;
cin>>n;
for(ll i=0;i<n;i++)
{
cin>>a[i];
Max=max(Max,a[i]-Min);
Min=min(Min,a[i]);
}
cout<<Max<<endl;
//system("pause");
return 0;
}