题解 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;
}
posted @ 2018-12-07 22:08  加固文明幻景  阅读(16)  评论(4)    收藏  举报  来源