链接:https://ac.nowcoder.com/acm/contest/949/D
来源:牛客网

水果店里有 nnn个水果排成一列。店长要求顾客只能买一段连续的水果。
小阳对每个水果都有一个喜爱程度 aia_iai​,最终的满意度为他买到的水果的喜欢程度之和。
如果和为正(不管是正多少,只要大于 0即可),他就满意了。
小阳想知道在他满意的条件下最多能买多少个水果。
你能帮帮他吗?

输入描述:

第一行输入一个正整数 nnn,表示水果总数。

第二行输入 nnn个整数aia_iai​,表示小阳对每个水果的喜爱程度。

输出描述:

一行一个整数表示结果。(如果 1 个水果都买不了,请输出 0)

示例1

输入

5
0 0 -7 -6 1

输出

1

备注:
1≤n≤2×1e61≤n≤2×1e 61≤n≤2×1e6,∣ai∣≤1e3∣a_ i ∣≤1e 3∣ai​∣≤1e3

代码:

way1:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e6+5;
#define INF 0x3f3f3f3f
int sum[MAXN];
int s[MAXN];
int main()
{int n;scanf("%d",&n);int x;sum[0] = 0;for(int i = 1; i <= n; i ++){scanf("%d",&x);sum[i] = sum[i-1] + x;}//way1:,sum数组存前缀和,s数组存i到最后的后缀最大和memset(s,-INF,sizeof(s));for(int i = n; i  > 0; i--){s[i] = max(sum[i],s[i+1]);}int ans = 0;for(int i  = 0,j = 1; i < n; i++,j++){if(sum[i]>=s[j]) //move at the same time,because ans that in the middle  less than recent anscontinue;else{while(s[j]>sum[i]&&j<=n)  j++;j--;  // the last greater than sum[i]}ans = max(ans,j-i);}printf("%d\n",ans);return 0;
}

way2:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e6+5;
#define INF 0x3f3f3f3f
int sum[MAXN];
int s[MAXN];
int main()
{int n;scanf("%d",&n);int x;sum[0] = 0;for(int i = 1; i <= n; i ++){scanf("%d",&x);sum[i] = sum[i-1] + x;}//way2:s数组存前面到到i的前缀最小和s[0] = INF;for(int i = 1; i <= n; i++){s[i] = min(s[i-1],sum[i]);}int ans = 0;for(int i = 1; i <= n; i++){if(sum[i] > 0){ans = max(ans,i);}else if(s[i-1] >= sum[i]) continue;else{//the first less than sum[i] in range(1,i-1);int l = 1,r = i-1;int pos;while(l <= r){int mid = (l+r)>>1;if(s[mid] < sum[i]){pos = mid;r = mid - 1;}else{l = mid + 1;}}ans = max(ans,i-pos);}}printf("%d\n",ans);return 0;
}

way3:

直接排序,按前缀和递增排序,
前缀和相同所在位置大的(pos)排序
(ps: 前缀和相同时,pos小的在前面结果可能会更新,pos大的前面就能保证结果不被更新),
排序前要记录原来的位置(pos)
为什么直接排序可以做呢?
基本思路是,排完序后,
后面的前缀和一定比前面的大,
只要前面有个 原来的index(pos)
比当前位置的 原来index(pos)小就可以更新答案

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e6+5;
struct Node
{int sum;int pos;bool operator<(const Node &a)const{if(sum == a.sum)return pos > a.pos;return sum < a.sum;}
};
Node a[MAXN];
int main()
{int n;scanf("%d",&n);a[0].pos = 0;a[0].sum = 0;int x;for(int i = 1; i <= n; i++){scanf("%d",&x);a[i].pos = i;a[i].sum = a[i-1].sum + x;}sort(a,a+n+1);/*the worst situation maybe TLE,because the quickSort the worst situation need O(n^2)*/int minx = 1<<30,ans = 0;for(int i = 0; i <= n; i++)//此时已有单调性(单调递增){minx = min(minx,a[i].pos);if(a[i].pos > minx)ans = max(ans,a[i].pos-minx);}printf("%d\n",ans);return 0;
}

小阳买水果(前缀和,单调栈,思维)相关推荐

  1. 牛客小白月赛19 D题 小阳买水果

    链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 小阳买水果 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  2. 牛客小白月赛16——D 小阳买水果

    链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  3. 【牛客网】 小白月赛16 D小阳买水果

    题目链接:https://ac.nowcoder.com/acm/contest/949/D 题意:寻找最长的连续序列,满足序列和大于0. 题解:按照前缀和的大小排序,可以保证后面的一定大于等于前面( ...

  4. 【算法百题之十八】18年网易面试题,小易买水果

    [算法百题之十八]小易买水果     大家好,我是Lampard~~     很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!     今天的问题是:     小易为了向他的 ...

  5. 单调栈思维 2021年度训练联盟热身训练赛第三场——K题 Summer Trip

    题意: 给你一个字符串,问其子串中有多少个满足: 1.子串头尾字母不相同: 2.子串内部字母与头尾字母不相同: 3.子串长度大于等于2: 问有多少个这样的字串? 题目: Leo has started ...

  6. 牛客小白月赛16 D-小阳买水果(单调队列)

    链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 题目描述 水果店里有 n个水果排成一列.店长要求顾客只能买一段连续的水果. 小阳对每个水果都有一 ...

  7. upc组队赛1 小C的数学问题【单调栈】(POJ2796)

    小C的数学问题 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n ...

  8. LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 . 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) ...

  9. C语言:【入门】小明买水果

    题目描述 小明去超市买了若干斤水果,你能根据水果的单价,小明买的水果数量,编一个程序计算出总金额,并打印出清单. 输入 两行   第一行商品的单价,是一个小数   第二行商品的数量,是一个整数 输出 ...

最新文章

  1. Servlet的初始化参数
  2. 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架
  3. 更改列表的默认项标记的颜色、大小等样式的解决办法
  4. 安装和使用Ant Design Vue 图标库
  5. java多线程编程—高级主题_Java day20 高级编程【第一章】Java多线程编程
  6. 【整理】LISP简介
  7. pojo和java对象_java对象 POJO和JavaBean的区别
  8. 写专业书确能帮助自己快速提升——写在我的书出版半年后,同时和大家分享选书的方式...
  9. AAA及RADIUS/HWTACACS协议简介
  10. python 字典查找效率_Python字典查找性能,get-vs-in
  11. jquery插件(转)
  12. BZOJ2555:SubString(SAM,LCT)
  13. 华为mate20云备份恢复卡住了_注意了!包括华为、荣耀在内的14款老机型开启EMUI11公测了...
  14. 研究生论文排版工具:LaTeX
  15. Lumerical官方案例、FDTD时域有限差分法仿真学习(五)——液晶(liquid crystal)
  16. CST材料库相关问题
  17. 反向题在测试问卷信效度_问卷信度效度检验
  18. vscode 使用 SDCC 开发 STM8
  19. 面试官怎样面试出合格的技术人员
  20. 定义一个名为 Circle的类,编写程序测试这个圆类的所有方法。

热门文章

  1. feign.RetryableException null executing post
  2. busybox arm-linux-gcc 4.4.4库的路径,BUSYBOX编译错误及解决方法总结
  3. mybatis没有clob类型_mybatis将Oracle的Clob类型转成String的方法
  4. cmw500综合测试仪使用_高端示波器是德MSOX4154A示波器-产品使用操作说明书【二手示波器吧】...
  5. SpringMVC使用AOP
  6. 130 道 Kubernetes + Docker + DevOps 大厂面试题及知识点详解
  7. 肝!Python 网络编程
  8. pandas中apply与map的异同
  9. 说说每月至少一次的那点事,文末有彩蛋!
  10. 猎魂觉醒显示无法连接战斗服务器,猎魂觉醒安装失败怎么办_猎魂觉醒安装失败解决方法_游戏吧...