51nod-1065 最小正子段和 【贪心 + 思维】
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数
输出最小正子段和。
8
4
-1
5
-2
-1
2
6
-2
1
解题思路:记录前缀累加和,然后排序,检查相邻的两项是否能够组成子序列,可以的话就记录该值D,记录最小的D就是结果。
排序的目的是找到前缀和最接近的数。
附ac代码:
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <string>
5 #include <cmath>
6 #include <string>
7 #include <iostream>
8 #include <map>
9 #include <queue>
10 const int maxn = 5 * 1e4 + 10;
11 const int inf = 0x3f3f3f3f;
12
13 using namespace std;
14 typedef long long ll;
15 const ll mod = 1e9 + 7;
16 ll nu[maxn];
17 struct nod {
18 int r;
19 ll sum;
20 }ans[maxn];
21 bool cmp(nod a, nod b) {
22 if(a.sum < b.sum) return 1;
23 else if(a.sum == b.sum && a.r < b.r) return 1;
24 return 0;
25 }
26 int main(int argc, const char * argv[]) {
27 // int t;
28 int n;
29 scanf("%d", &n);
30 ll minn = inf;
31 for(int i = 1; i <= n; ++i) {
32 scanf("%lld", &nu[i]);
33 ans[i].sum = ans[i - 1].sum + nu[i];
34 ans[i].r = i;
35 if(nu[i] > 0)
36 minn = min(nu[i], minn);
37 if(ans[i].sum > 0)
38 minn = min(ans[i].sum, minn);
39 }
40 // printf("%lld %lld xxxx\n", ans[2].sum, minn);
41 sort(ans + 1, ans + 1 + n, cmp);
42
43
44 for(int i = 2; i <= n; ++i) {
45 if(ans[i].r > ans[i - 1].r && ans[i].sum - ans[i - 1].sum > 0)
46 minn = min(minn, ans[i].sum - ans[i - 1].sum);
47 if(ans[i].r < ans[i - 1].r && ans[i - 1].sum - ans[i].sum > 0)
48 minn = min(minn, ans[i - 1].sum - ans[i].sum);
49
50 }
51 if(minn == inf) puts("no solution");
52 else
53 printf("%lld\n", minn);
54 return 0;
55 }
51nod-1065 最小正子段和 【贪心 + 思维】的更多相关文章
- 51nod 1065 最小正子段和 (贪心)
题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&& ...
- 51nod 1065 最小正子段和
题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...
- 51nod 1065 最小正字段和 解决办法:set存前缀和,二分插入和二分查找
题目: 这题要求大于0的最小字段和,常规O(n)求最大字段和的方法肯定是没法解的. 我的解法是:用sum[i]存前i项的和,也就是前缀和. 这题就变成了求sum[j]-sum[i]的大于0的最小值( ...
- 51nod 1065:最小正子段和
1065 最小正子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 取消关注 N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一 ...
- AC日记——最小正子段和 51nod 1065
最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include & ...
- 51nod-1065:最小正子段和(STL)
N个整数组成的序列a11,a22,a33,…,ann,从中选出一个子序列(aii,ai+1i+1,…ajj),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如:4,-1 ...
- 【zznu-2060】 Minsum Plus(最小正子段和)
题目描述 题意简单到令人发指! 序列A由N个整数组成,从中选出一个连续的子序列,使得这个子序列的和为正数,且和为所有和大于零的子序列中的最小值. 将这个值输出,若无解,输出no solution. 输 ...
- [51nod1065]最小正子段和
题意:求一个序列中大于0的最小子段和. 解题关键: 先求出前缀和和,对于每个位置求某个位置到当前位置和大于1的和的最小值.然而这是复杂度是O(n^2)的.其实可以通过排序优化到O(nlogn).对前缀 ...
- [51NOD1065] 最小正子段和(STL,前缀和)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 估计没人这么做吧-用一个set维护前缀和,但是set的l ...
随机推荐
- Java安全之Weblogic 2018-3248分析
Java安全之Weblogic 2018-3248分析 0x00 前言 基于前面的分析,后面的还是主要看补丁的绕过方式,这里就来简单的记录一下. 0x01 补丁分析 先来看看补丁细节 private ...
- 翻译 - ASP.NET Core 基本知识 - 中间件(Middleware)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0 中间件是集成 ...
- Infrastructure as Code 行为驱动开发指南 https://www.ibm.com/developerworks/cn/devops/d-bbd-guide-iac/index.html
Infrastructure as Code 行为驱动开发指南 https://www.ibm.com/developerworks/cn/devops/d-bbd-guide-iac/index.h ...
- Covering Indexes in MySQL, PostgreSQL, and MongoDB
Covering Indexes in MySQL, PostgreSQL, and MongoDB - Orange Matter https://orangematter.solarwinds.c ...
- 利用burp抓取https的包
本片文章仅供学习使用,切勿触犯法律! 0x01.打开burp的代理监听器 0x02.使用代理访问 这里我是用的是mantra,其他浏览器同理. 0x03.浏览器输入http://burp 点击CA C ...
- php中一种单引号逃逸造成的注入
demo如下: $post = $_POST; $sql=''; $array['name'] = $post['name']; $array['age'] = 18; $array['addr'] ...
- 安装Archlinux+UEFI启动
为了安装Arch自己也走了很多弯路,找了很多教程,最后探索出了这样一个安装方法,不一定适用于每个人. ArchWiki官方安装手册 本方法全程插上网线. 准备 获取镜像 镜像可以从官网获取,访问官方下 ...
- 渗透测试流程——渗透测试的9个步骤(转)
目录 明确目标 分析风险,获得授权 信息收集 漏洞探测(手动&自动) 漏洞验证 信息分析 利用漏洞,获取数据 信息整理 形成报告 1.明确目标 1)确定范围:测试的范围,如:IP.域名.内外网 ...
- centos 7_本地源制作
1.安装工具 yum install yum-utils createrepo yum-plugin-priorities 2.自己创建一个阿里源 vim /etc/yum.repos.d/ope ...
- Effective Java读书笔记--创建和销毁对象
1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...