UVA 11078 Open Credit System (水题)

题意:给一个长度为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;
}



你可能感兴趣的:(水题,uva)