您的位置:首页 > 其它

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

2016-10-24 21:56 211 查看
就是本来是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 0X3F3F3F3F
using 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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: