https://vjudge.net/problem/UVA-11078
题意:
给出一个整数序列,要求找出两个位置i,j(i < j),Ai - Aj的值最大,并且输出这个最大值。
思路:
原来我考虑的是一边遍历,一边排序,求Aj - Ai的最小值,然后总的复杂度是O(NlogN),但是没有想到这样都tle了,贴上代码警示。
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 int a[100005]; 6 7 int main() 8 { 9 int t; 10 11 scanf("%d",&t); 12 13 while(t--) 14 { 15 int n; 16 17 scanf("%d",&n); 18 19 int ans = 100000000; 20 21 for (int i = 1;i <= n;i++) 22 { 23 scanf("%d",&a[i]); 24 } 25 26 //int maxn = a[1]; 27 28 for (int i = 2;i <= n;i++) 29 { 30 sort(a+1,a+i); 31 32 ans = min(ans,a[i] - a[i-1]); 33 } 34 35 printf("%d\n",-ans); 36 } 37 38 return 0; 39 }
后来呢,那么这个都过不了,只有用线性的时间喽,所以就动态更新这个坐标之前的最大值,那么最大值肯定是某个坐标前面的最大值静减去当前值,所以就可以O(N)得出答案。
代码:
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 int a[100005]; 6 7 int main() 8 { 9 int t; 10 11 scanf("%d",&t); 12 13 while(t--) 14 { 15 int n; 16 17 scanf("%d",&n); 18 19 int ans = -100000000; 20 21 for (int i = 1;i <= n;i++) 22 { 23 scanf("%d",&a[i]); 24 } 25 26 int maxn = a[1]; 27 28 for (int i = 2;i <= n;i++) 29 { 30 ans = max(maxn - a[i],ans); 31 32 maxn = max(a[i],maxn); 33 } 34 35 printf("%d\n",ans); 36 } 37 38 return 0; 39 }