小阳买水果(前缀和,单调栈,思维)
链接: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;
}
小阳买水果(前缀和,单调栈,思维)相关推荐
- 牛客小白月赛19 D题 小阳买水果
链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 小阳买水果 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...
- 牛客小白月赛16——D 小阳买水果
链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 【牛客网】 小白月赛16 D小阳买水果
题目链接:https://ac.nowcoder.com/acm/contest/949/D 题意:寻找最长的连续序列,满足序列和大于0. 题解:按照前缀和的大小排序,可以保证后面的一定大于等于前面( ...
- 【算法百题之十八】18年网易面试题,小易买水果
[算法百题之十八]小易买水果 大家好,我是Lampard~~ 很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙! 今天的问题是: 小易为了向他的 ...
- 单调栈思维 2021年度训练联盟热身训练赛第三场——K题 Summer Trip
题意: 给你一个字符串,问其子串中有多少个满足: 1.子串头尾字母不相同: 2.子串内部字母与头尾字母不相同: 3.子串长度大于等于2: 问有多少个这样的字串? 题目: Leo has started ...
- 牛客小白月赛16 D-小阳买水果(单调队列)
链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 题目描述 水果店里有 n个水果排成一列.店长要求顾客只能买一段连续的水果. 小阳对每个水果都有一 ...
- upc组队赛1 小C的数学问题【单调栈】(POJ2796)
小C的数学问题 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n ...
- LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)
文章目录 1. 题目 2. 解题 1. 题目 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 . 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) ...
- C语言:【入门】小明买水果
题目描述 小明去超市买了若干斤水果,你能根据水果的单价,小明买的水果数量,编一个程序计算出总金额,并打印出清单. 输入 两行 第一行商品的单价,是一个小数 第二行商品的数量,是一个整数 输出 ...
最新文章
- Servlet的初始化参数
- 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架
- 更改列表的默认项标记的颜色、大小等样式的解决办法
- 安装和使用Ant Design Vue 图标库
- java多线程编程—高级主题_Java day20 高级编程【第一章】Java多线程编程
- 【整理】LISP简介
- pojo和java对象_java对象 POJO和JavaBean的区别
- 写专业书确能帮助自己快速提升——写在我的书出版半年后,同时和大家分享选书的方式...
- AAA及RADIUS/HWTACACS协议简介
- python 字典查找效率_Python字典查找性能,get-vs-in
- jquery插件(转)
- BZOJ2555:SubString(SAM,LCT)
- 华为mate20云备份恢复卡住了_注意了!包括华为、荣耀在内的14款老机型开启EMUI11公测了...
- 研究生论文排版工具:LaTeX
- Lumerical官方案例、FDTD时域有限差分法仿真学习(五)——液晶(liquid crystal)
- CST材料库相关问题
- 反向题在测试问卷信效度_问卷信度效度检验
- vscode 使用 SDCC 开发 STM8
- 面试官怎样面试出合格的技术人员
- 定义一个名为 Circle的类,编写程序测试这个圆类的所有方法。
热门文章
- feign.RetryableException null executing post
- busybox arm-linux-gcc 4.4.4库的路径,BUSYBOX编译错误及解决方法总结
- mybatis没有clob类型_mybatis将Oracle的Clob类型转成String的方法
- cmw500综合测试仪使用_高端示波器是德MSOX4154A示波器-产品使用操作说明书【二手示波器吧】...
- SpringMVC使用AOP
- 130 道 Kubernetes + Docker + DevOps 大厂面试题及知识点详解
- 肝!Python 网络编程
- pandas中apply与map的异同
- 说说每月至少一次的那点事,文末有彩蛋!
- 猎魂觉醒显示无法连接战斗服务器,猎魂觉醒安装失败怎么办_猎魂觉醒安装失败解决方法_游戏吧...