求条件最大值

求条件最大值

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 }  
时间: 2024-10-15 09:33:59

求条件最大值的相关文章

树状数组求区间最大值

------  一直用 线段树 求区间最大值,想换种思路,用树状数组试试,肯定是可以的. 首先要对 树状数组的每个 i 所管理的区间有一定的理解.详见上篇博客: 树状数组(BIT)

1010 求个最大值

1010: 求个最大值 时间限制: 1 Sec  内存限制: 128 MB提交: 231  解决: 39[提交][状态][讨论版] 题目描述 给出 n(1 <= n <= 200000)个数字 ai(1 <= ai <= 1000000),i 为数字的下标,按输入顺序从 1 开始编号一直到 n,求满足 ai >= aj 的最大的 ai % aj. 输入 第一行一个数字 n,第二行 n 个整数. 输出 题目要求的最大值. 样例输入 2 2 3 样例输出 1 提示

Problem J: 求个最大值

Problem J: 求个最大值 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 871  Solved: 663[Submit][Status][Web Board] Description 定义MaxValue类,用于求一系列非零整数的最大值.其中: 1. 数据成员elements用于存储所有输入的非零整数. 2. void append(int)用于向elements中添加一个新数据. 3. int getMax()用于求出elements中的

29.求数组最大值

import java.util.Scanner; public class MaxScore { /** * 求数组最大值 */ public static void main(String[] args) { int[] scores = new int[5]; int max = 0; //记录最大值 System.out.println("请输入5位学员的成绩:"); Scanner input = new Scanner(System.in); for(int i = 0;

C语言 不使用if判断求出最大值和最小值

作者 : 卿笃军 上次老师问我们,如果我给你两个整数,你们如何输出其中的较大数,或者较小数呢? 当然,一个if就搞定了,但是如果不能让你们用if判断,你还能找出来吗? 答案是当然的. 首先分析一下,加入给了我们2个数,分别是:5 和 2,这要如何找出来呢? 5 - 2 = 3  ,说明两数相差为3,我们可以从这里入手. 5 + 2 + 3 = 10 . 这不就是5的两倍吗? 5 + 2 - 3 = 4 .这是2的两倍. 哦,下面C语言实现一下: #include <stdio.h> #incl

求局部最大值

求局部最大值问题: 给定一个无重复元素的数组A[0...N-1],找到一个该数组的局部最大值. 问题分析: 遍历一遍得全局最大值,它显然是局部最大值,但是时间复杂度是O(n),现在要求时间复杂度为O(logn). 问题求解过程类似于二分查找,但是还不完全一样,需要分析清楚问题来源.问题中只需要求出一个局部最大值,并且数组中不考虑重复的元素. 因此,可以每次取中间点,当A[mid] > A[mid+1]  丢弃后半段,right = mid; 当A[mid] < A[mid+1],丢弃前半段,l

【C++】输入8个数,求出最大值与最小值

//输入8个数,求出最大值与最小值 #include <iostream> using namespace std; int max(int b[],int n),min(int b[],int n); int main() { int a[8]; cout<<"输入8个int型数 :"; for(int i=0;i<8;i++) cin>>a[i]; cout<<"最大数为 "<<max(a,8)&

Problem A: 求个最大值

Problem A: 求个最大值 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1635  Solved: 1339[Submit][Status][Web Board] Description 定义MaxValue类,用于求一系列非零整数的最大值.其中: 1. 数据成员elements用于存储所有输入的非零整数. 2. void append(int)用于向elements中添加一个新数据. 3. int getMax()用于求出elements

从键盘录入几个数,求取最大值?

首先声明一个方法名compare1的方法(也可以直接在main函数中执行) public static void compare1() {/*** 从键盘录入几个数,求取最大值*/System.out.println("从键盘录入5个数:");Scanner sc = new Scanner(System.in);int arr[] = new int[5];for(int i = 0;i<5;i++) {arr[i] = sc.nextInt();}System.out.pri