zzuli求最大值

1786: 求最大值

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 134  Solved: 28
SubmitStatusWeb Board

Description

给定n个数,a[1]到a[n],请你帮忙找出a[i] - a[j]的最大值,其中1 <= i < j <= n.

Input

第一行一个数T,表示一共有T组数据(T <= 20); 每组测试数据第一行一个整数n(2 <= n <= 10 ^ 5),表示接下来有n个数,第二行n个整数,不超过10 ^ 6,中间用空格隔开。

Output

每组数据输出一行,表示最大值是多少。

Sample Input

2 5 5 2 3 6 1 2 3 2

Sample Output

5 1

题解:

题意是让找出a[i] - a[j]的最大值,但是i<j;

思路是找出a[i]前面最大的数px,再贪心找出px-a[i]的最大值就好了。。。

但是自己竟然想到了用LIS来找。。。直接px>a[i]?不就好了吗?把问题复杂化了。。。

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int MAXN=1e5+100;
 8 int main(){
 9     int T,N;
10     scanf("%d",&T);
11     while(T--){
12         scanf("%d",&N);
13         int x,px,ans=-1e7;
14         scanf("%d",&x);
15         px=x;
16         for(int i=1;i<N;i++){
17             scanf("%d",&x);
18             ans=max(ans,px-x);
19             if(x>px)px=x;
20         }
21         printf("%d\n",ans);
22     }
23     return 0;
24 }

自己的二分超时代码。。。。纯属无用工。。。肯定超时了。。。

//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=1e5+100;
int m[MAXN];
vector<int>vec;
typedef vector<int>::iterator ITE;
ITE erfen(ITE a,ITE b,int x){
	int mid,l=0,r=b-a;
	while(l<r){
		mid=(r-l)/2;
		if(vec[mid]>=x)r=mid-1;
		else l=mid+1;
	}
	return a+l;
}
int main(){
	int T,n;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		int mx,ans=-1e7;
		vec.clear();
		for(int i=0;i<n;i++){
			scanf("%d",m+i);
			if(i){
				mx=vec[vec.size()-1];
			//	printf("%d\n",mx);
				ans=max(ans,mx-m[i]);
			}
			vector<int>::iterator iter;
			iter=erfen(vec.begin(),vec.end(),m[i]);
			if(iter==vec.end())vec.push_back(m[i]);
			else *iter=m[i];
		}
		printf("%d\n",ans);
	}
	return 0;
}

  

时间: 2025-01-15 09:51:22

zzuli求最大值的相关文章

求最大值和scanf函数的使用以及函数的声明

/* ============================================================================ Name : MaxNumber.c Author : lf Version : Copyright : Your copyright notice Description : 求最大值和scanf函数的使用以及函数的声明 ==========================================================

1138: 零起点学算法45——求最大值

1138: 零起点学算法45--求最大值 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1691  Accepted: 879[Submit][Status][Web Board] Description 输入一些整数,求最大值 Input 多组测试数据 首先输入1个整数n表示测试组数 然后每行首先输入1个整数m,再输入m个整数 Output 对于每组测试数据输出1行,内容为m个整数的最大值 Sa

九度oj 题目1046:求最大值

题目1046:求最大值 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:11782 解决:4789 题目描述: 输入10个数,要求输出其中的最大值. 输入: 测试数据有多组,每组10个数. 输出: 对于每组输入,请输出其最大值(有回车). 样例输入: 10 22 23 152 65 79 85 96 32 1 样例输出: max=152 1 #include <iostream> 2 #include <vector> 3 #include <algorithm&g

&lt;28&gt;【了解】10-枚举类型介绍及定义+【掌握】11-枚举变量变量定义和使用+【掌握】13-typedef定义新的类型+【掌握】15-宏的概念及无参宏定义方法+【掌握】16-有参宏定义和使用方法+【掌握】17-应用:使用有参宏求最大值+【掌握】18-typedef和#define的区别

[了解]10-枚举类型介绍及定义 枚举类型: C语言提供了一个种类型,这种类型的变量的取值被限定在一定的范围之内了 枚举类型的定义: enum 枚举类型名{ 枚举值1,枚举值2,.... }; 举例: 定义一个变量,保存一周的第几天 enum weekday{ zhouyi,zhouer,zhousan,zhousi,zhouwu ,zhouliu,zhouri }; 定义iPhone手机的颜色 关于枚举类型元素的命名习惯 enum iColor{kIcolorWhite,kIcolorBlac

矩阵连乘 和表达式加括号求最大值

矩阵连乘核心代码1 for(int i=0;i<=n;i++) 2 m[i][j]=0; 3 for(r=1;r<n;r++) 4 for(i=1;i<=n-r;i++) 5 { 6 j=i+r; 7 m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; 8 s[i][j]=i; 9 for(k=i+1;k<j;k++) 10 { 11 int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; 12 if(t<m[i][j]) 13

数组用法----求最大值、最小值和平均数

public class d { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 //数组 求最大值.最小值.平均分 int a[]={70,80,90,75,84,88}; int n; int min =100; int max = 1; for(n=0;n<6;n++) { if(max<a[n]) { max=a[n];//循环比较max和a[n]的大小 }else if(m

MapReduce求最大值最小值问题

import java.io.File; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapreduce.Job; import

HDU 1754 I Hate It 线段树单点更新求最大值

题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 200005 using namespace std; int data[N]; struct Tree { int l,r,ans; }tree[N*4]; void build(in

分组求最大值,最小值 使用开窗函数经验总结

select distinct TT.prod_id, tt.creteTime, tt.inspection_time, tt.cnt from (select s.prod_id, min(s.datetime_created) over(partition by s.prod_id) as creteTime, max(s.inspection_time) over(partition by s.prod_id) as inspection_time, sum(s.complete_cou