题目描述

题意简单到令人发指!
序列A由N个整数组成,从中选出一个连续的子序列,使得这个子序列的和为正数,且和为所有和大于零的子序列中的最小值.
将这个值输出,若无解,输出no solution。

输入

第一行输入一个正整数N(2<N<50000)

第二行输入N个整数

输出

输出最小的正子段和

样例输入

3
-1 2 3

样例输出

1

思路

记录前缀和,然后排序,满足前缀和之差最小和下标递增的关系就行,注意longlong!!longlong!!

#include <bits/stdc++.h>
using namespace std;
const int N = ;
typedef long long LL;
struct node
{
LL x, y;
} q[N];
bool cmp(node a, node b)
{
if(a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int main()
{
int n, x;
cin>>n;
for(LL i = ; i <= n; i++)
{
scanf("%d", &x);
q[i].x = q[i-].x + x;
q[i].y = i;
}
sort(q+, q++n, cmp);
LL ans = 1e18;
int base = ;
for(int i = ; i <= n; i++)
{
if(q[i].x > q[base].x && q[i].y > q[base].y)
{
ans = min(ans, q[i].x - q[base].x);
base++;
i = base;
}
}
if(ans == 1e18) puts("no solution");
else
printf("%lld\n", ans);
return ;
}

也可以利用set和lower_bound写

#include <bits/stdc++.h>
using namespace std;
const int N = ;
typedef long long LL;
LL a[N];
set<LL>S;
int main()
{
int n, x;
cin>>n;
for(int i = ; i <= n; i++)
{
scanf("%d", &x);
a[i] = a[i-] + x;
}
S.clear();
LL ans = 1e18;
for(int i = ; i <= n; i++)
{
S.insert(a[i]);
if(a[i] > )
ans = min(ans, a[i]);
set<LL>::iterator it = S.lower_bound(a[i]);
if(it == S.begin()) continue;
it--;
if(a[i] - (*it) <= ) continue;
ans = min(ans, a[i] - (*it));
}
if(ans == 1e18) puts("no solution");
else printf("%lld\n", ans);
return ;
}

【zznu-2060】 Minsum Plus(最小正子段和)的更多相关文章

  1. 51nod 1065 最小正子段和

    题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...

  2. AC日记——最小正子段和 51nod 1065

    最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include & ...

  3. 51nod-1065:最小正子段和(STL)

    N个整数组成的序列a11,a22,a33,…,ann,从中选出一个子序列(aii,ai+1i+1,…ajj),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如:4,-1 ...

  4. 51nod 1065:最小正子段和

    1065 最小正子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  取消关注 N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一 ...

  5. 51nod-1065 最小正子段和 【贪心 + 思维】

    N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一个子序列(a[i],a[i+1],-a[j]),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如 ...

  6. [51nod1065]最小正子段和

    题意:求一个序列中大于0的最小子段和. 解题关键: 先求出前缀和和,对于每个位置求某个位置到当前位置和大于1的和的最小值.然而这是复杂度是O(n^2)的.其实可以通过排序优化到O(nlogn).对前缀 ...

  7. 51nod 1065 最小正子段和 (贪心)

    题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&& ...

  8. [51NOD1065] 最小正子段和(STL,前缀和)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 估计没人这么做吧-用一个set维护前缀和,但是set的l ...

  9. 51Node 1065----最小正子段和

    51Node  1065----最小正子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子序列(a[i],a[i+1],…a[j]),使这个子序列的和>0,并且这 ...

随机推荐

  1. Linux下编程学习一

    本篇主要记录一些在学习LINUX下编程时,, C和C++语言的一些基础的常识, 一. 函数指针 void MyFun(int x); 函数声明 void (*FunP)(int ); 函数指针声明 下 ...

  2. TOSCA自动化测试工具视频资料

    https://www.udemy.com/ search 'TOCSA' 找到两个免费资料学习

  3. java红黑树

    从这里学了一些知识点https://blog.csdn.net/sun_tttt/article/details/65445754,感谢作者

  4. python---自动群发邮件

    生活中我们经常发送邮件,那么我们能不能用Python写一个自动发送邮件的功能呢?答案是肯定的!!! 开始实现功能之前我们需要开启我们邮箱的 IMAP/SMTP功能,我们先了解一下什么是IMAP/SMT ...

  5. 20145322《Java程序设计》第5次实验报告

    20145322<Java程序设计>第5次实验报告 实验内容 1.根据所学内容,编写代码实现服务器与客户端 2.掌握密码技术的使用 3.设计安全传输系统,客户端中输入明文,利用DES算法加 ...

  6. linux-android(任务处理)

    1.开辟任务内存 2.设置每个任务优先级 ,,

  7. Hive压缩格式

    TextFile Hive数据表的默认格式,存储方式:行存储. 可使用Gzip,Bzip2等压缩算法压缩,压缩后的文件不支持split 但在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此 ...

  8. go语言中strings包中的Trim函数的作用是什么

    答:Trim函数原型如下: func Trim(s string, cutset string) string 去掉字符串s中首部以及尾部与字符串cutset中每个相匹配的字符,如: s=" ...

  9. git基础常用维护命令

    开发模式介绍 master为生产环境分支 trunk为测试环境分支 开发分支由程序员自己取名 比如来一个新项目之后,下面步骤都是在本地操作 1.从本地获取远程master最新代码,保证本地master ...

  10. RunLoop Note

    I. Begin from Apple Document Apple describes the priciples of runloop in Threading Programming Guide ...