【水题】求条件最大值

时间:2022-06-19 15:10:55

求条件最大值

Time Limit: 1000MS Memory limit: 65536K

题目描述

懒得想背景故事了,开门见山。
有一个长度为n的整数数列A0,A1,A2....An-1。从中找出两个整数Ai和Aj,Ai在Aj的前面,即i<j,使得Ai-Aj尽可能的大。请输出可能的最大的Ai-Aj的值。

输入

 多组输入。每一组测试数据的第一行是一个整数n,然后第二行是n个整数,第i个数
表示Ai。(测试数据组数<=20,2<=n<=10^6,-10^8<=Ai<=10^8).

输出

 每组测试数据输出一行一个整数,为可能的最大的Ai-Aj的值。

示例输入

5
3 1 2 4 3
5
3 1 2 4 1

示例输出

2
3

应该从后开始求最小值,当从后开始只有1个数的时候,最小值就是本身;当从后开始只有2个数的时候,应该是两个数中的最小值;当从后开始只有3个数的时候,
最小值为3个数中的最小值......当从后开始数n个数的时候,最小值为n个数中的最小值,先把这个求出来,然后再遍历比较就可以了。

 1 #include<iostream>  
 2 #include<algorithm>  
 3 #include<stdio.h>  
 4   
 5   
 6 using namespace std;  
 7   
 8 int s[1000100], t[1000100];  
 9 int maxx, minn;  
10   
11 int main()  
12 {  
13     int n, i,  k=1, maxx, minn;  
14     while(cin>>n)  
15     {  
16         k =1;  
17         minn = 1e9;  
18         maxx = -1e9;  
19         for(i=0; i<n; i++)  
20             scanf("%d", &s[i]);  
21         minn = s[n-1];  
22         t[k++] = minn;  
23         for(i=n-2; i>=1; i--)//求最小值
24         {  
25             if(s[i]<minn)  
26             {  
27                 t[k++] = s[i];  
28                 minn = s[i];  
29             }  
30             else  
31             {  
32                 t[k++] = minn;  
33             }  
34   
35         }  
36       
37         for(i=0; i<n-1; i++)  
38         {  
39             if( (s[i]-t[n-i-1]) >maxx)  
40             {  
41                 maxx = s[i]-t[n-i-1];  
42             }  
43         }  
44         printf("%d\n", maxx);  
45     }  
46     return 0;  
47 }