您的位置:首页 > 运维架构

UVA 11078 - Open Credit System

2014-04-18 10:43 435 查看
这道题用两重循环很明显会超时,所以需要做优化,我用的方法是从数组的最后一位开始到第1位(下标从0开始),找到当前的最小的J值,然后把这个最小的值保存到一个数组里,然后再从第0位到N-2位找I的值,只要和第I位的后一位所保存的最小值的数组一减就可以,时间是O(n),但是保存最小值需要空间。

 

#include <cstdio>
#include <algorithm>
using namespace std;
int a[1000005];
int minj[1000005];
int main(){
int i,j;
int T;
scanf("%d",&T);

while(T--){
int n;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int minn=200000000;
for(i=n-1;i>=1;i--){
if(a[i]<minn)
minn=a[i];
minj[i]=minn;
}
int maxn=-20000000;
for(i=0;i<n-1;i++){
if(maxn<(a[i]-minj[i+1]))
maxn=a[i]-minj[i+1];
}
printf("%d\n",maxn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: