题意:给一个长度为n的序列A0,A1...An-1,找出两个整数Ai和Aj(i<j),使得Ai-Aj尽量大。
思路:O(n^2)算法显然TLE,因此对于每个数Ai,其实只要减去Ai+1到An-1中的最小值即可,倒着扫并用一个minval去维护Ai+1到An-1中的最小值,用Ai减去当前的minval就是Ai作为第一个数来减去第二个数所能得到的最优解。输出所有的最大值即可。
完全是一道水题。。拿来测试刚学会的输入输出优化。。writeint和readint就是优化读入用的。
#include<cstdio>
#include<cctype>
#include<iostream>
#define MAXN 100005
#define INF 0x3f3f3f3f
using namespace std;
int n,buf[20],A[MAXN],T;
inline int readint()
{
char c=getchar();
bool flag=1;
while(!isdigit(c)) {if(c=='-') flag=0;c=getchar();}
int x=0;
while(isdigit(c))
{
x=x*10+c-'0';
c=getchar();
}
if(!flag) x*=-1;
return x;
}
inline void writeint(int i)
{
int p=0;
if(i<0) {putchar('-');i*=-1;}
if(!i) ++p;
else while(i)
{
buf[p++]=i%10;
i/=10;
}
for(int j=p-1;j>=0;--j) putchar('0'+buf[j]);
}
int main()
{
T=readint();
while(T--)
{
n=readint();
for(int i=0;i<n;++i) A[i]=readint();
int minval=A[n-1],ans=-INF;
for(int i=n-2;i>=0;--i)
{
ans=max(ans,A[i]-minval);
minval=min(minval,A[i]);
}
writeint(ans);
putchar('\n');
}
return 0;
}