P1714 切蛋糕

题目描述

今天是小Z的生日,同学们为他带来了一块蛋糕。这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值。

小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但小Z最多又只能吃M小块(M≤N)的蛋糕。

吃东西自然就不想思考了,于是小Z把这个任务扔给了学OI的你,请你帮他从这N小块中找出连续的k块蛋糕(k≤M),使得其上的幸运值最大。

输入格式

输入文件cake.in的第一行是两个整数N,M。分别代表共有N小块蛋糕,小Z最多只能吃M小块。

第二行用空格隔开的N个整数,第i个整数Pi代表第i小块蛋糕的幸运值。

输出格式

输出文件cake.out只有一行,一个整数,为小Z能够得到的最大幸运值。

输入输出样例

输入 #1

5 2
1 2 3 4 5

输出 #1

9

输入 #2

6 3
1 -2 3 -4 5 -6

输出 #2

5

说明/提示

对20%的数据,N≤100。

对100%的数据,N≤500000,|Pi|≤500。 答案保证在2^31-1之内。

思路

把比自己大的出队列——>将当前前缀入队列——>将超出距离的出队列——>更新答案

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=500010;

int a[N],sum[N];
int n,m,ans,q[N];

int main () {
	ans=-1e8;
	int h=1,t=0;
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
		sum[i]=sum[i-1]+a[i];
	}
	for(int i=1; i<=n; i++) {
		while(h<=t&&sum[q[t]]>=sum[i])
			t--;
		q[++t]=i;
		while(q[h]<i-m)
			h++;
		ans=max(ans,sum[i]-sum[q[h]]);
	}
	printf("%d\n",ans);
	return 0;
}

原文地址:https://www.cnblogs.com/mysh/p/11816242.html

时间: 2024-07-29 19:19:53

P1714 切蛋糕的相关文章

luogu P1714 切蛋糕 |单调队列

题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但小Z最多又只能吃M小块(M≤N)的蛋糕. 吃东西自然就不想思考了,于是小Z把这个任务扔给了学OI的你,请你帮他从这N小块中找出连续的k块蛋糕(k≤M),使得其上的幸运值最大. 输入格式 输入文件cake.in的第一行是两个整数N,M.分别代表共有N小块蛋糕,小Z最多只能吃M小块. 第二行用空格隔开的N个整

[洛谷P1714]切蛋糕

题目大意:给你n个数,要你求一段长度不超过k的.和最大的连续子序列,问你最大的和是多少. 解题思路:单调队列+前缀和优化. 可以发现,i到j的和与k到j的和,当j变化时,这两个和的相对大小关系是不变的. 我们用单调队列保存与当前第i个位置距离小于k(等于则不能加到)的位置,并让这个位置加到i的和单调递减. 这样就能保证每次从队头弹出时,之后的和仍是最大. 求一段连续序列的和就用到前缀和优化. 总时间复杂度$O(n)$. C++ Code: #include<cstdio> #include&l

NYOJ 869 切蛋糕

切蛋糕 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 有如下图半径为R的圆形蛋糕,被切一刀后(图中红色直线),分成两个部分(黄色和绿色),已知其比例为r,求刀痕长度(图中红色直线). 输入 输入包括多组测试数据,包括一个整数R(1<=R<=1000),和一个浮点数r(0<r<1),精确到第四位小数. 输出 对于每组测试用例,输出一个浮点数,代表刀痕的长度,保留二位小数. 样例输入 1000 0.5000 500 0.6183 样例输出 1928.53

hdu 切蛋糕

1:切蛋糕问题 Problem Description 或许你曾经牢骚满腹 或许你依然心怀忧伤 或许你近在咫尺 或许你我天各一方对于每一个学子 母校  永远航行在 生命的海洋今年是我们杭电建校五十周年,这是一个值得祝福的日子.我们该送给母校一个怎样的礼物呢?对于目前的大家来说,最好的礼物当然是省赛中的好成绩,我不能参赛,就送给学校一个DOOM III球形大蛋糕吧,这可是名牌,估计要花掉我半年的银子呢.想象着正式校庆那一天,校长亲自操刀,把这个大蛋糕分给各地赶来祝贺的校友们,大家一定很高兴,呵呵,

TZOJ 3042 切蛋糕(并查集)

描述 KK是个心灵手巧的好姑娘,她做了一个大蛋糕请她的好朋友们来品尝.这个蛋糕分成n×n个正方形小格,每个小格包含一块水果.KK要把蛋糕切成若干块,显然她不会破坏任意一个小格.无聊的某同学在她切蛋糕时不停地问她同一种问题:某两个小格是否还在同一块蛋糕里?例如下图中,KK从(1,1)切到(4,1),又从(1,1)切到(1,4),从而将蛋糕分成了两块.然后又从(2,1)切到(2,3),从(1,3)切到(2,3),于是把整个蛋糕分成了三块.其中小格(2,2)只和小格(2,3)连通,与其它所有小格不连通

【Luogu P1714】切蛋糕(面向对象编程首次尝试?)

Luogu P1714 题目的大意就是给定一个长度为n的序列,求出这个序列中长度不超过m的子串的最大和 很容易想出的一个解法就是枚举起点终点,直接暴力扫一遍得出答案. 当然也很容易发现这种做法肯定会TLE. 也有一个很容易想到的优化方法--利用前缀和. 但是我们会发现即便如此,还是会TLE. 也就是说枚举这条路看起来走不通的样子-- 那么我们换一个思路 依然是利用前缀和的思想,首先观察部分和的公式: sum[i~j]=sum[j]-s[i-1]. 如果我们目标区间内使被减数尽可能大,减数尽可能小

NOIP模拟:切蛋糕(数学欧拉函数)

题目描述  BG 有一块细长的蛋糕,长度为 n. 有一些人要来 BG 家里吃蛋糕, BG 把蛋糕切成了若干块(整数长度),然后分给这些人. 为了公平,每个人得到的蛋糕长度和必须相等,且必须是连续的一段. 但是, BG 并不知道要有多少人来. 他只知道, 来的人数为n的约数,且小于n. 显然把蛋糕平均分成 n 块一定能满足要求.但是, BG 想要分出的块数尽量少.现在 BG 想知道,他要把蛋糕分成至少多少块,才能使得不管多少人来都能满足要求. 输入格式 输入文件名为 cake.in. 输入共一个整

1648切蛋糕

题意:将一球形蛋糕切N刀,最多可切多少块. 分析:推规律 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<set> 6 #include<map> 7 #include<algorithm> 8 #include<cstdlib> 9 #include<vector>

黑皮切蛋糕

描述 众所周知,黑皮出生与1000年01月01日,那天乌云密布,电闪雷鸣,在黑光划破夜空的一瞬间,黑皮准确无误的生成了男孩.不妨给大家说声:由于他天生体黑,故取名为黑皮.^-^     为了庆祝黑皮的1006岁生日,也就是2006年01月01日.校长为他在学校里举行一个名为{天造奇才}的大型庆祝活动.邀请全校的师生及其家属们都参加.考虑到当时人数相当庞大,黑皮的好友小佳佳特地为他从美国进口了个超级无敌五香麻辣阴阳五行令万千饿鬼为之绝倒的巨无霸大蛋糕1号.供到场的所有人享用.     黑皮也考虑到