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

Luogu P1714

题目的大意就是给定一个长度为n的序列,求出这个序列中长度不超过m的子串的最大和

很容易想出的一个解法就是枚举起点终点,直接暴力扫一遍得出答案。

当然也很容易发现这种做法肯定会TLE。

也有一个很容易想到的优化方法——利用前缀和。

但是我们会发现即便如此,还是会TLE。

也就是说枚举这条路看起来走不通的样子……

那么我们换一个思路

依然是利用前缀和的思想,首先观察部分和的公式:

sum[i~j]=sum[j]-s[i-1]。

如果我们目标区间内使被减数尽可能大,减数尽可能小,就可以保证sum[i~j]最大。

同时维护被减数最大减数最小好像比较麻烦……

那么我们可以换一个方向思考:

维护一个动区间内的最小减数,然后枚举被减数即可

什么样的数据结构可以满足这样的操作呢?

很明显,线段树单调队列可以做到。

Code time:

//其实可以手写一个单调队列,但是最近学习一些有关类的知识就顺便练练手了。
//代码还是很好懂的,即使没学过应该也能轻松看懂
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class queue
{
    int x[5000005],head,tail;
public:
    void set()
    {
        head=1;
        tail=1;
        memset(x,0,sizeof(x));
    }
    void push_back(int y)
    {
        x[tail++]=y;
    }
    void pop_front()
    {
        head++;
    }
    bool empty()
    {
        return head==tail;
    }
    void pop_back()
    {
        tail--;
    }
    int back()
    {
        return x[tail-1];
    }
    int front()
    {
        return x[head];
    }
    //由于stl自带的queue只支持队头弹出,deque又不会用,于是手写了一个类。
    //(大概算是面向对象编程的首次尝试?)
}que;
int n,m,a,sum[500005],ans;
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a);
        sum[i]=sum[i-1]+a;//前缀和预处理
    }
    que.set();
    for (int i=1;i<=n;i++)
    {
        while (sum[que.back()]>sum[i]&&!que.empty()) que.pop_back();
        que.push_back(i);
        if (i-que.front()>m&&!que.empty()) que.pop_front();
        ans=max(ans,sum[i]-sum[que.front()]);
    }//单调队列基本操作
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/notscience/p/11783123.html

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

【Luogu 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 切蛋糕

题目描述 今天是小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

Python面向对象编程指南(高清版)PDF

Python面向对象编程指南(高清版)PDF百度网盘链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网盘手机App,操作更方便哦内容简介 · · · · · · Python是一种面向对象.解释型的程序设计语言,它已经被成功应用于科学计算.数据分析以及游戏开发等诸多领域.本书深入介绍Python语言的面向对象特性,全书分3个部分共18章.第1部分讲述用特殊方法实现Python风格的类,分别介绍了init

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

函数式编程与面向对象编程的比较

函数式编程作为结构化编程的一种,正在受到越来越多的重视.工程中不在只是面向对象编程,更多的人尝试着开始使用函数式编程来解决软件工程中遇到的问题. 什么是函数式编程?在维基百科中给出了详细的定义,函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.函数编程语言最重要的基础是λ演算(lambda calculus).而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值

面向对象编程(OOP)基础知识(一)

Java是一个支持并发.基于类和面向对象的计算机编程语言. 下面列出了面向对象软件开发的优点: 1.代码开发模块化,更易维护和修改. 2.代码复用. 3.增强代码的可靠性和灵活性. 4.增加代码的可理解性. 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象.下面的章节我们会逐个分析这些特性. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在Java当中,有3种修饰符:public,private和protected.每一种修饰符给

PHP 面向对象编程和设计模式 (5) - PHP 命名空间的使用及名称解析规则

PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性. PH

面向对象编程——设计模式之一

一.面向对象 面向对象,就是将一些属性和行为封装成对象,对于使用者来说不用关心对象的内部具体实现,只管调用它公开的属性方法就行了.同一类型的对象抽象出来就是类.类是对象的模板. 面向对象编程,共三步: 1.设计系统的类和接口: 2.设计类和接口的方法和属性: 3.建立类类和接口之间的关系(继承.实现.依赖.关联(聚合.组合关系)): 类和接口之间的关系请参考:http://www.cnblogs.com/liuling/archive/2013/05/03/classrelation.html