版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Xylon_/article/details/87691808
7-6 拿糖果 (15 分)
HSP和他的女朋友ZM来到了商店,商店有n个糖果,标号依次为1,2,3....n,对应的价值为W1,W2,W3...Wn。现在HSP先拿走一个标号为a的糖果,标号小于a的糖果就被ZM收回去了,然后HSP只能在剩下的糖果中选一个标号为b的糖果,请问Wa-Wb的最大值是多少?
输入格式:
多组数据输入,每一组数据第一行输入一个数字 n(2<=n<=100000),接下来n行,每行输入一个wi表示第i个糖果的价值
(0<wi<=100000)
输出格式:
每组数据输出Wa-Wb的最大值
输入样例:
3
3 2 1
6
1 1 1 1 1 1
输出样例:
2
0
很有意思的一道题,如果直接看题面很容易联想到用DP做,但是如果把题目上的操作反过来看,就是拿起一个糖果,把这个糖果编号之后的糖果都拿走,然后从编号之前的糖果中选一个价值最小的(使得Wa-Wb最大)。那么就很好理解了,因为正序遍历的情况下我们可以得到已经遍历过的糖果中最小的那一个,那么与当前糖果相减就是最佳答案,取最大值即可。
时间复杂度O(n)
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define closeio std::ios::sync_with_stdio(false)
int a[100005];
int main()
{
closeio;
int n,i,j,Max,Min;
while(cin>>n)
{
Max=-inf,Min=inf;
for(i=0;i<n;i++)
cin>>a[i];
for(i=n-2;i>=0;i--)
{
Min=min(Min,a[i+1]);
Max=max(Max,a[i]-Min);
}
cout<<Max<<endl;
}
return 0;
}