最优规则式 XDU1024

1.题目描述:点击打开链接

2.解题思路:本题要求找到四个数,满足a<b<c<d,且arr[a]+arr[d]-arr[b]-arr[c]最大。可以利用扫描法来解决。首先可以将目标式理解为两个不相交区间上的最大差值的和。那么目标就是找所有这些不想交区间最大差值的和的最大值。定义Left[i]数组维护区间[0,i)上的最大差值,Right[i]维护区间[i,n)上的最大差值。那么这两个数组不难找到如下递推式:

Left[i]=max{Left[i-1],arr[i-1]-minx};

上式中,minx是区间[0,i-1)上的最小元素。同理可得Right数组的递推式:

Right[i]=max{Right[i+1],maxx-arr[i]};

上式的maxx表示区间[i+1,n)上的最大元素。每次都可以只用O(N)的时间即可算出数组的所有值。这样,最终的答案就是max(Left[i]+Right[i])。总的时间复杂度为O(N)。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define N 100000+5
int a[N];
int Left[N], Right[N];

typedef long long ll;

int main()
{
	//freopen("t.txt", "r", stdin);
	int T;
	scanf("%d", &T);
	while (T--)
	{
		int n;
		scanf("%d", &n);
		for (int i = 0; i < n; i++)
			scanf("%d", &a[i]);
		int ans = 0;
		memset(Left, 0, sizeof(Left));
		memset(Right, 0, sizeof(Right));
		Left[2] = a[1] - a[0];
		int minx = min(a[0],a[1]);
		for (int i = 3; i <= n; i++)
		{
			Left[i] = max(Left[i - 1], a[i - 1] - minx);
			minx = min(minx, a[i - 1]);//minx晚于Left[i]更新
		}
		Right[n - 2] = a[n - 1] - a[n - 2];
		int maxx = max(a[n - 1], a[n - 2]);
		for (int i = n - 3; i >= 0; i--)
		{
			Right[i] = max(Right[i + 1], maxx - a[i]);
			maxx = max(maxx, a[i]);
		}
		for (int i = 2; i < n - 1; i++)
			ans = max(ans, Left[i] + Right[i]);
		printf("%d\n", ans);
	}
	return 0;
}
时间: 2024-11-02 19:49:47

最优规则式 XDU1024的相关文章

第 四 十 一 天:mysql 调 优 方 式

小Q:世界上最快而又最慢,最长而又最短,最平凡而又最珍贵,最易被人忽视 而又最让人后悔的就是时间.                    ----高尔基 ======================================================================= MySQL调优可以从几个方面来做: 1. 架构层: 做从库,实现读写分离: 2.系统层次: 增加内存: 给磁盘做raid0或者raid5以增加磁盘的读写速度: 可以重新挂载磁盘,并加上noatime参数

SpringBoot —— AOP注解式拦截与方法规则拦截

AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. SpringBoot中AOP的使用方式主要有两种:注解式拦截与方法规则拦截,具体使用如下文所示. 一.创建一个简单springboot 2.03项目,添加aop依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId

java 内存 垃圾回收调优

要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多个独立的部分.广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generation). 年轻代 年轻代是所有新对象产生的地方.当年轻代内存空间被用完时,就会触发垃圾回收.这个垃圾回收叫做Minor GC.年轻代被分为3个部分——Enden区和两个Su

Java内存与垃圾回收调优

本文由 ImportNew - 进林 翻译自 journaldev.欢迎加入翻译小组.转载请参见文章末尾的要求. 要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多个独立的部分.广泛地说,JVM堆内存被分为两部分--年轻代(Young Generation)和老年代(Old Generation). 年轻代 年轻代是所有新对象产生的地方.当年轻代内

规则影响分析:防火墙策略规划的好帮手

网络安全设备的强度取决于它的规则和策略.防火墙可以对入站和出站信息都设立规则.入站规则旨在阻止恶意***,而出站规则则保护数据不会被发送到未经授权的远程位置.由于***不断地破坏网络规则,因而,确保你的防火墙足够"牢固"变得至关重要.许多企业面临的问题是,规则优化不是一次性的任务,而是需要不断的分析审查,此外,大多数企业网络都有成千上万条规则,这也使得手动执行分析任务变得异常困难.也就是说,安全管理员需要定期执行以下活动: ? ? 优化现有规则? ? 重新排序规则从而获得最快的速度?

人工智能简答总结

第一章 绪论 智能:智能是知识与智力的总和.知识是一切智能行为的基础,智能是获取知识,运用知识求解问题的能力. 智能的特征:具有感知能力.具有记忆和思维能力.具有学习能力.具有行为能力. 人工智能:人工智能是用人工的方法在机器上实现的智能. 人工智能研究的基本内容:知识表示.机器感知.机器思维.机器学习(机器学习就是研究如何使计算机具有类似于人类的学习能力,使他能通过学习自动的获取知识).机器学习. 人工智能的主要研究领域: 1.自动定理证明:2.博弈:3.模式识别:4.机器视觉:5.自然语言理

Python正则表达式Regular Expression基本用法

资料来源:http://blog.csdn.net/whycadi/article/details/2011046   直接从网上资料转载过来,作为自己的参考.这个写的很清楚.先拿来看看. 1.正则表达式re模块的基本函数. (1)findall函数的用法 findall(rule,target[,flag])是在目标字符串中找到符合规则的字符串.参数说明:rule表示规则,target表示目标字符串,[,flag]表示的是规则选项.返回的结果是一个列表.若没找到符合的,是一个空列表. 如: 因

黑客工具软件大全100套

黑客工具软件大全100套  ゴリラ大統領 2011-05-21 16:55:58 #1 Nessus:最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上.它不止永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance--终端用户授权协议).它的主要功能是远程或本地(已授权的)安全检查,客户端/服务器架构,GTK(Linux下的一种图形界面)图形界面,内置脚本语言编译器,可以用其编写自定义插件,或用来阅读别人

游戏开发中的人工智能 复习

游戏开发中的人工智能 复习 (个人复习,一些仅是给自己的复习提示(=w=),转载注明出处:http://blog.csdn.net/hcbbt/article/details/42815479) 配套教材:游戏开发中的人工智能 知识点 移动 Bresenham,视线(略),拦截 // Bresenham if (deltaCol > deltaRow) { fraction = deltaRow * 2 - deltaCol; while (nextCol != endCol) { if (fr