首页 > 其他分享 >洛谷题单指南-常见优化技巧-P1714 切蛋糕

洛谷题单指南-常见优化技巧-P1714 切蛋糕

时间:2024-09-10 18:13:51浏览次数:6  
标签:&& max P1714 int 洛谷题 代码 head 蛋糕 ans

原题链接:https://www.luogu.com.cn/problem/P1714

题意解读:求长度不超过m的最大子段和

解题思路:

1、暴力法

设a[N]表示原数组,s[N]是a[N]的前缀和,对于每一个元素s[i],计算其与前m个元素之差,取差值最大值,用代码表示:

for(int i = 1; i <= n; i++)
{
    for(int j = i - 1; j >= i - m && j >= 0; j--)
    {
        ans = max(ans, s[i] - s[j]);
    }
}

76分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 500005;
int n, m;
int a[N], s[N];
int ans = INT_MIN;

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];

    for(int i = 1; i <= n; i++)
    {
        for(int j = i - 1; j >= i - m && j >= 0; j--)
        {
            ans = max(ans, s[i] - s[j]);
        }
    }

    cout << ans;
    return 0;
}

2、单调队列优化

仔细观察一下暴力法的代码:

此段代码可以改写成:

for(int i = 1; i <= n; i++)
{
    int minx = INT_MAX;
    for(int j = i - 1; j >= i - m && j >= 0; j--)
    {
       minx = min(minx, s[j]);
    }
    ans = max(ans, s[i] - minx);
}

进一步观察代码:

红色框部分是要在长度为m的窗口内找最小值,因此可以采用单调队列来优化

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 500005;
int n, m;
int a[N], s[N];
int ans = INT_MIN;
int q[N], head = 0, tail = -1;

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];

    for(int i = 0; i <= n; i++) //需要注意的是,i需要从0开始,这样队列第一个元素可能是0,是为了保证区间和正确:s[r]-s[l-1]
    {
        while(head <= tail && i - q[head] > m) head++;
        while(head <= tail && s[i] <= s[q[tail]]) tail--;
        ans = max(ans, s[i] - s[q[head]]);
        q[++tail] = i;
    }

    cout << ans;
    return 0;
}

 

标签:&&,max,P1714,int,洛谷题,代码,head,蛋糕,ans
From: https://www.cnblogs.com/jcwy/p/18406904

相关文章

  • 洛谷题单指南-常见优化技巧-P2880 [USACO07JAN] Balanced Lineup G
    原题链接:https://www.luogu.com.cn/problem/P2880题意解读:在若干个不定长区间里,求区间最大值与最小值之差解题思路:对于区间求最值,通常有几种方式:1、暴力法,通过枚举所有的区间来计算区间最值2、单调队列,针对区间长度固定的情况3、ST表,针对区间长度不固定且元素不会发生改变的......
  • 洛谷题单指南-常见优化技巧-P1886 滑动窗口 /【模板】单调队列
    原题链接:https://www.luogu.com.cn/problem/P1886题意解读:单调队列模版题。解题思路:采用双端队列维护单调的序列,单调队列三部曲:1、去头,当窗口内元素个数超过k,队头出队2、去尾,当要加入的元素会破坏单调性,队尾出队3、入队,将元素的下标存入队列每一次入队后,队头元素即为窗口最......
  • 洛谷题单指南-常见优化技巧-P3467 [POI2008] PLA-Postering
    原题链接:https://www.luogu.com.cn/problem/P3467题意解读:用长方形的海报覆盖建筑的侧面,最少需要的海报数如上图,左边最少需要3张,右边最少需要4张解题思路:可以看出,需要海报数与建筑宽度无关,只与高度有关。当建筑高度与之前不同时,肯定需要增加一张海报;当建筑高度与之前有相同......
  • Uni-App项目开发实战:‌《‌蛋糕订购》‌Vue项目
    Uni-App项目开发实战:‌《‌蛋糕订购》‌Vue项目在当今移动互联网高速发展的时代,‌小程序作为一种轻量级应用,‌凭借其无需下载、‌即用即走的特性,‌受到了广大用户的喜爱。‌Uni-App作为一个使用Vue.js开发所有前端应用的框架,‌能够编译到iOS、‌Android、‌以及各种小程序等多个......
  • 洛谷题单指南-常见优化技巧-P3143 [USACO16OPEN] Diamond Collector S
    原题链接:https://www.luogu.com.cn/problem/P3143题意解读:找到两个不相交的最长连续序列,使得序列最大值和最小值差不超过k,求两个最长的序列长度和。解题思路:先将所有数从小到大排序,记为a[]要找到两个不相交的最长连续序列,可以采用下面技巧:设b[i]表示i之前“差值在k之内的连续......
  • 洛谷题单指南-常见优化技巧-P4653 [CEOI2017] Sure Bet
    原题链接:https://www.luogu.com.cn/problem/P4653题意解读:选中的灯泡中,某一类较少的总权值减去灯泡数量所得到的收益最大值。解题思路:注意,此题关键是:要使得较少的收益最大化1、要最大化,意味着每次应该选择尽可能大权值的灯泡2、要使A、B类中较少的收益最大化,意味着每次应该优......
  • 洛谷题单指南-常见优化技巧-唯一的雪花 Unique Snowflakes
    原题链接:https://www.luogu.com.cn/problem/UVA11572题意解读:本质上是要计算最长连续不重复子序列的长度,典型的双指针应用。解题思路:通过双指针来枚举子序列,右指针指向的元素每次记录元素出现的次数,可以借助hash数组h[]如果枚举到的元素出现次数超过1,则表示左、右指针之间的子......
  • 洛谷题单指南-常见优化技巧-P2216 [HAOI2007] 理想的正方形
    原题链接:https://www.luogu.com.cn/problem/P2216题意解读:在矩阵中找n*n正方形里最大值和最小值差值的最小值。解题思路:1、枚举法直接枚举所有n*n的正方形的位置,然后在遍历求最大值、最小值,复杂度为O(n^4),显然不能通过。2、二维单调队列既然是求正方形范围内的最值,看起来是......
  • 洛谷题单指南-常见优化技巧-P2032 扫描
    原题链接:https://www.luogu.com.cn/problem/P2032题意解读:求滑动窗口内的最大值,典型的单调队列应用。解题思路:单调队列的三部曲:1、去头。已存入的元素个数超过k,则去头。注意队列里存的是元素下标,只需要用当前下标减去队头元素来判断即可。2、去尾。根据单调队列的单调性,如果......
  • 洛谷题单指南-常见优化技巧-P1950 长方形
    原题链接:https://www.luogu.com.cn/problem/P1950题意解读:在一张n*m个格子的纸上,从没有画过的格子中剪出长方形的方案数。解题思路:1、暴力做法枚举所有的子矩阵O(n^4),然后用二维前缀和计算子矩阵的和,通过和来判断子矩阵是否全部是'.'。2、优化做法针对每一行进行处理,计算包......