题意给你一个序列A[1...N],你必须修改一个A[i]为P,使得修改后的序列A的连续最大和最大
其中N<=1000
分析,N非常小,N^2暴力随便做,不细讲
说一个O(N)的算法
我们知道O(N)的求连续最大和的算法
那么定义L[i], R[i]分别为L[i]以i为结尾的最大连续和,R[i]一i为开头的连续最大和
由于必须要修改一个A[i]为P,这个修改后的A[i]可能不包含在连续最大和中,也可能包含在连续最大和中
如果包含,那么就等价于:max(L[i - 1], 0) + max(R[i + 1], 0) + P
如果不包含,那么就计算1...n-1的最大L[i], 2...n的最大的R[i]
为什么是 计算1...n-1的最大L[i], 2...n的最大的R[i] 而不是全部跑一遍
都是少一个?
因为必须修改A[1...n]中的某一个元素为P
比如说
n = 3 P = -100
A[1...3] = {10, 10, 10}
那么答案就是20,并非30
总是少一个的原因就是假设修改的那一个元素并没有影响到当前答案
如果修改后的A[i]=P并没有在最大的连续子段和中,那么一定在这连续子段和之外,设这个最大连续子段和的子段为A[l...r],一定保证l>1或者r<n,不然最大连续子段和的子段就变成A[1...n],与前面矛盾,那么我们就可以把A[1]变成P或者把A[n]变成P
若i=n,那么我们就只需要枚举L[1...n - 1]
若i=1,那么我们就只需要枚举R[2..n]
 #include <set>
#include <map>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm> #define dprint(expr) fprintf(stderr, #expr " = %d\n", expr) using namespace std; typedef long long LL;
typedef pair <int, int> PII; const int N = 1e5 + ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
const double EPS = 1e-;
const double PI = acos(-1.0); int a[N];
LL l[N], r[N]; int main(void){
int T;
scanf("%d", &T);
while (T--) {
int n, p;
scanf("%d%d", &n, &p);
for (int i = ; i <= n; ++i)
scanf("%d", &a[i]);
l[] = r[] = l[n + ] = r[n + ] = ;
for (int i = ; i <= n; ++i)
l[i] = max(l[i - ] + a[i], (LL)a[i]);
for (int i = n; i; --i)
r[i] = max(r[i + ] + a[i], (LL)a[i]);
LL ans = -INF;
for (int i = ; i <= n; ++i) {
ans = max(ans, max(l[i - ], 0LL) + max(r[i + ], 0LL) + p);
}
for (int i = ; i < n; ++i) {
ans = max(ans, l[i]);
}
for (int i = n; i > ; --i) {
ans = max(ans, r[i]);
}
printf("%I64d\n", ans);
}
return ;
}

hdu 5280 贪心 O(n)算法的更多相关文章

  1. hdu 1269 迷宫城堡(Targin算法)

    ---恢复内容开始--- 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. hdu 1009 贪心算法

    博主英语不好,看懂个大概,老鼠有M磅猫食.有N个房间,每个房间前有一只猫,房间里有老鼠最喜欢的食品JavaBean,J[i].若要引开猫,必须付出相应的猫食F[i]. 当然这只老鼠没必要每次都付出所有 ...

  3. ACM: HDU 3790 最短路径问题-Dijkstra算法

    HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  4. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  5. hdu 5280 Senior's Array

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5280 Senior's Array Description One day, Xuejiejie ge ...

  6. Hdu 5289-Assignment 贪心,ST表

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...

  7. hdu 4803 贪心/思维题

    http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么?  G++  AC  C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ...

  8. HDU 2066 最短路floyd算法+优化

    http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...

  9. hdu 1735(贪心) 统计字数

    戳我穿越:http://acm.hdu.edu.cn/showproblem.php?pid=1735 对于贪心,二分,枚举等基础一定要掌握的很牢,要一步一个脚印走踏实 这是道贪心的题目,要有贪心的意 ...

随机推荐

  1. Adobe Acrobat XI 中文版激活方法

    Adobe Acrobat XI不仅只是出色的PDF编辑.转换软件.此次更新深度整合了Microsoft Office套件,实现了PDF与Word.Excel以及PowerPoint等文档间的无缝相互 ...

  2. SQL Injection(Blind)

    SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是 ...

  3. C#追加日志文件

    追加日志文件 using System; using System.IO; class DirAppend { public static void Main() { using (StreamWri ...

  4. superset连接sqlite频繁断开

    出现上述现象的原因是SQLite只支持库级锁,不支持并发执行写操作,即使是不同的表,同一时刻也只能进行一个写操作.例如,事务T1在表A新插入一条数据,事务T2在表B中更新一条已存在的数据,这两个操作是 ...

  5. Random Pick with Weight

    Given an array w of positive integers, where w[i] describes the weight of index i, write a function  ...

  6. 云数据库 Redis 版

    首先观看视频简介 云数据库 Redis 版是一项易于部署和管理的按需数据库服务,与 Redis 协议兼容.云数据库 Redis 版通过从内存缓存中检索数据而提供高速数据读写功能,并通过同时使用内存和硬 ...

  7. 完全删除MySQL及相关软件

    一.删除mysql服务 个人认为首先删除mysql服务最重要,这个多数人会忘记如何删除 首先是查看自己的mysql服务名,需要用这个服务名进行删除 进入命令行 二.卸载mysql,workbench等 ...

  8. idea 修改pom文件jdk版本回退问题解决

    在Java开发是我们大多都使用集成开发环境,像idea和eclipse用的都比较多,在使用idea maven构建项目时,在修改pom.xml文件时,我们的项目jdk版本都会回退,还得每次去设置中修改 ...

  9. postgresql 服务无法启动,日志中报如下错误

    1.postgresql 服务无法启动,日志中报如下错误,磁盘空间足够. 无法找到来自源 PostgreSQL 的事件 ID 0 的描述.本地计算机上未安装引发此事件的组件,或者安装已损坏.可以安装或 ...

  10. O015、OpenStack 架构

    参考https://www.cnblogs.com/CloudMan6/p/5340622.html   终于正式进入OpenStack 部分了.   今天开始正式学习OpenStack,OpenSt ...