题解 UVA11078 【Open Credit System】
蓝书上的题目的好多题解都是照搬啊,希望各位注明下出处吧。。。
这道题蓝书上给的$O(n)$解法大概是这样的,大概就是维护一个$maxx$表示当$i<j$时$a[i]$的最大值,然后不断更新它的最大值和答案的最大值即可。
但是!——在最后蓝书上还布置了个作业,写个边读入边处理的解法。现在就来讲下这个解法。
在$O(n)$解法中,我们发现,这个$maxx$的值是不会被第$j$个数之后的数改变的,所以根本不需要读入后再处理,直接在读入第$j$个数时把$maxx$更新一下就行了,然后同样更新下答案的最大值。
$\mathcal{CODE:}$
#include <cstdio>
#define inf 0x7fffffff
#define max(a,b) (a)>(b)?(a):(b)
inline void read(int &x)
{
x=0;char ch=0;bool sign=false;
while(ch < '0' || ch > '9')
{
sign|=(ch == '-');
ch=getchar();
}
while(!(ch < '0' || ch > '9'))
{
x=x*10+(ch^48);
ch=getchar();
}
x=sign ? -x : x;
}
inline void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+'0');
}
int n,a[10000100];
int ans,maxx;
int main()
{
int T;
read(T);
for(int kase=1; kase<=T; kase++)
{
ans=-inf,maxx=-inf/3;
read(n);
for(int i=1; i<=n; i++)
{
read(a[i]);
ans=max(ans,maxx-a[i]);
maxx=max(a[i],maxx);
}
print(ans);
putchar('\n');
}
return 0;
}