天津大学OJ_2017_07_12比赛I题L-The math problem

L-The math problem

Description:

Given an array a with n intergers, please tell me the max(aj−ai),0≤i≤j≤n−1.

Input:

The input consists of multiple test cases. The first line contains an integer T, indicating the number of test cases.(1≤T≤1000)
Each case contains one integer N.(0≤N≤10^7). Then comes a line with N intergers ai(−10^7≤ai≤10^7)

Output:

For each case only output the answer.

Sample Input:

1
5
1 3 5 4 2 

Sample Output:

4

题目意思:

就是给你n个数,然后让你找max{aj-ai},其中j>=i的。

思路:

  • 首先我们要知道我们最好只能扫一遍就能求出。所以要不断更新最小值和最大差值。

  • 可以这样想,我们从第一个数开始扫,得到当前值 a[i] ,当遇到比我们当前最小值 minNum 更小的就更新最小值 minNum = a[i] 。这一步执行完后,还要用当前数 a[i] 减去当前最小值 minNum ,得到当前的差值 tempX ,如果当前差值大于当前最大差值 maxNum , 就更新最大差值maxNum。

  • 当我们遇到一个更小的数的时候,就应该更新最小值,以后都是当前值减去最小值这样得到的差值肯定比当前值减去上一次的最小值要大。同时我们得到的差值也需要比较,比当前最大差值大我们才更新,这样一直下去就可以再后面的数减去前面的数的前提下得到最大差值。

AC代码:

    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;

    int a[10000010];

    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n;
            int max = 0;
            int minNum = 1 << 30; 
            scanf("%d",&n);
            for(int i=0;iscanf("%d",&a[i]);

            //开始扫
            for(int i = 0;iif(a[i] < minNum)      //更新最小值
                    minNum = a[i];

                if(a[i] - minNum > max)  //更新最大差值
                    max = a[i] - minNum;    
            } 
            printf("%d\n",max); 
        } 
        return 0;
    } 

你可能感兴趣的:(acm之路)