题干:

在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币。但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币。因为这些数字都是可见的,所以大家都是不会出现的赔的情况。

游戏规则:每人只能抓一次,只能抓取一段连续的纸团,所有纸团上的数字和就是你可以获得的蒜币。

蒜头君作为蒜厂的一员在想,我怎么可以获得最多的蒜币呢?最多能获取多少蒜币呢?

因为年会是发奖,那么一定有大于 00 的纸团。

输入格式

第一行输入一个整数 nn,表示有 nn 个纸团。

第二行输入输入 nn 个整数 a_iai​,表示每个纸团上面写的数字(这些纸团的输入顺序就是环形桌上纸团的摆放顺序)。

输出格式

输出一个整数,表示蒜头君最多能获取多少蒜币。

数据范围

对于 30\%30% 的数据:1 \le n \le 10^2,-10^3 \le a_i \le 10^31≤n≤102,−103≤ai​≤103。

对于 60\%60% 的数据:1 \le n \le 5 \times 10^3,-10^6 \le a_i \le 10^61≤n≤5×103,−106≤ai​≤106。

对于 100\%100% 的数据:1 \le n \le 10^5,-10^9 \le a_i \le 10^91≤n≤105,−109≤ai​≤109。

样例输入复制

3
1 -2 1

样例输出复制

2

解题报告:

单调队列优化dp。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const int N = 200005;
int a[N];
LL pre[N];
int main() {int n;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);a[n + i] = a[i];}for (int i = 1; i <= 2 * n; i++) {pre[i] = pre[i - 1] + a[i];}deque<int> q;q.push_back(0);LL ans = a[1];for (int i = 1; i <= 2 * n; i++) {if (!q.empty() && q.front() < i - n) {q.pop_front();}ans = max(ans, pre[i] - pre[q.front()]);while (!q.empty() && pre[q.back()] >= pre[i]) {q.pop_back();}q.push_back(i);}printf("%lld\n", ans);return 0;
}

WA代码:(只通过60%)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll a[MAX],dp[MAX],dpp[MAX];
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) cin>>a[i];ll sum = 0 ;for(int i = 1; i<=n; i++) {if(sum >=0) sum += a[i],dp[i] = sum;else sum = a[i],dp[i] = sum;}for(int i = 1; i<=n; i++) {if(sum >=0) sum += a[i],dpp[i] = sum;else sum = a[i],dpp[i] = sum;}cout << max(*max_element(dp+1,dp+n+1),*max_element(dpp+1,dpp+n+1));return 0 ;}

最暴力的做法:(肯定会T的)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const int N = 200005;
int a[N];
LL pre[N];
int main() {int n;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);a[n + i] = a[i];}LL ans = a[1];for (int i = 1; i <= n; i++) {LL sum = 0;for (int j = i; j < i + n; j++) {sum += a[j];if (sum > ans) {ans = sum;}}}printf("%lld\n", ans);return 0;
}

另一个做法:

https://blog.csdn.net/weixin_41544329/article/details/85076111

【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)相关推荐

  1. 计蒜客 A2232.程序设计:蒜厂年会-单调队列(双端队列(STL deque)实现)滑窗维护最小前缀和...

    程序设计:蒜厂年会 问答问题反馈 只看题面 16.79% 1000ms 262144K 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是 ...

  2. 【计蒜客 - 蓝桥训练】欧拉函数(数学,数论,模板)

    题干: 在数论中,对正整数 nn,欧拉函数 \varphi (n)φ(n) 是小于等于 nn 的正整数中与 nn 互质的数的数目. 例如 \varphi (12)=4φ(12)=4,因为 1,5,7, ...

  3. 【计蒜客 - 蓝桥训练】阶乘位数(数学,对数运算,求阶乘位数)

    题干: 蒜头君对阶乘产生了兴趣,他列出了前 1010 个正整数的阶乘以及对应位数的表: nn n!n! 位数 1 1 1 2 2 1 3 6 1 4 24 2 5 120 3 6 720 3 7 50 ...

  4. 【计蒜客 - 蓝桥训练】修建公路(贪心,或运算,dp)

    题干: 蒜头国有 nn 座城市,编号分别为 0,1,2,3,\ldots,n-10,1,2,3,-,n−1.编号为 xx 和 yy 的两座城市之间如果要修高速公路,必须花费 x|yx∣y 个金币,其中 ...

  5. *【计蒜客 - 蓝桥训练】人以群分(二分 + dp)

    题干: 某班有 nn 个同学,每个同学有一个外向程度 a_iai​.由于要进行某个活动,需要把他们分成若干个小组,每个小组的人数至少为 mm 人.不同外向程度的人在一个小组会产生不开心值,定义一个小组 ...

  6. 【计蒜客 - 蓝桥训练】炮台实验(数学期望,期望dp)

    题干: 蒜头君在玩一个战争模拟游戏,他有高度为 1,2,3,\ldots ,n1,2,3,-,n 的炮台各一个,他需要把这 nn 个炮台从左往右排成一行,并且炮口都朝向右边. 在这个游戏中,所有炮台发 ...

  7. 【计蒜客 - 蓝桥训练】轻重搭配(贪心,STLset 或 二分)

    题干: n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票.现在给出了 nn 个人的体重,请你计 ...

  8. [计蒜客(蓝桥杯省赛)]蒜头君的购物袋2

    题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛) 算法标签 DP 题目描述 思路 01背包模板 题目代码 #include<iostream> #include<climits> ...

  9. 计蒜客习题:蒜厂年会

    问题描述 蒜厂要开年会了,所有的员工都要参加. 每两个员工之间都有一个亲密度.在同一个项目工作过的员工之间的亲密度为 1.如果 A 和 B.B 和 C 均在同一个项目中工作过,而 A 和 C 没有,那 ...

最新文章

  1. iOS - appledoc 文档生成
  2. mysql large pages_Linux HugePages及MySQL 大页配置
  3. PAT甲级1082 Read Number in Chinese:[C++题解]字符串处理
  4. 【Java】类加载过程
  5. 【计算机网络复习 数据链路层】3.6.1 局域网
  6. spring之@value设置默认值
  7. android+动画+锯齿,Android_rotate--animation 动画旋转两图片,消除动画锯齿现象 android 开发:动画旋转两图片 - 下载 - 搜珍网...
  8. Windows Server入门系列25 系统内置用户和组
  9. 贵族机要第二次半修改装备简单分配
  10. spring三级缓存
  11. 样本不平衡,欠采样,过采样
  12. 物联网技术主要有哪些,目前都应用在哪些领域?
  13. 51单片机——八段数码管
  14. 大数据时代,企业如何做好数据防泄漏?
  15. 淘宝-51CTO学院-01-概述 - OpenCV介绍与环境搭建
  16. mybatis 父子级树形结构查询
  17. 中断处理过程示意图_中断和中断处理流程
  18. 计算机控制系统陈振答案,北京理工大学自动化学院导师教师师资介绍简介-董 宁...
  19. 百度闪电算法什么时间开始
  20. 计算机考csp200分啥水平,计算机与信息工程学院成功举办第20次CCF CSP认证考试

热门文章

  1. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]
  2. [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
  3. c语言子查询返回子菜单,T-SQL基础(三)之子查询与表表达式
  4. python3.6 websocket异步高并发_在Python3.6上的websocket客户端中侦听传入消息时出现问题...
  5. centos6 5从命令行进入图形界面
  6. 253B. Physics Practical
  7. ccs6 linux安装教程,【图片】【吧主帖】在LINUX(ubuntu)系统下装CCSv6方法(原创)【dsp吧】_百度贴吧...
  8. 限定概率抽奖_守护星已点亮,内测皮肤得到没?从天美抽奖概率分析:地址什么梗...
  9. c语言inline不起作用,C语言inline内联函数学习小结
  10. java 获取打印机缺纸_JAVASE 语言概述和JAVA