水题,高效,优化(开放式学分制,uva 11078)

来源:互联网 发布:源码资本 趣分期 编辑:程序博客网 时间:2024/05/01 10:47

就是本来是O(n^2),然后从后往前枚举,顺便维护后面的最小值,就可以优化成O(n)。

然后自己写了一下输入输出还是快了一点的= =。20ms/50ms。


一开始输入没考虑负数,All these integers haveabsolute values less than 150000.理解成了全是整数,事实上意思是绝对值小于150000.

改了就过了。

这种优化思路很常见,以前做题遇到过很多,不过都只是题中的一小部分,而且维护和计算的情况更为复杂,这也算是模板了吧。


代码

#include<bits/stdc++.h>#define maxn 100010#define INF 0X3F3F3F3Fusing namespace std;int n;int a[maxn];inline void readint(int* p){    char c=getchar();    while(!(isdigit(c)||c=='-')) c=getchar();    *p=0;    bool fu;    if(c=='-')    {        fu=true;        c=getchar();    }    else fu=false;    while(isdigit(c))    {        *p=*p*10+c-'0';        c=getchar();    }    if(fu) *p=-*p;}int buf[10];inline void writeint(int& x){    bool fu;    if(x<0)    {        x=-x;        fu=true;    }    else fu=false;    int p=0;    if(x==0) buf[p++]=0;    else    {        while(x)        {            buf[p++]=x%10;            x/=10;        }    }    if(fu) putchar('-');    for(int i=p-1;i>=0;i--)        putchar('0'+buf[i]);    putchar('\n');}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)            readint(a+i);        int MIN=a[n];        int MAX=-INF;        for(int i=n-1;i>=1;i--)        {            MAX=max(MAX,a[i]-MIN);            MIN=min(MIN,a[i]);        }        writeint(MAX);    }    return 0;}


0 0
原创粉丝点击