首页 > 其他分享 >洛谷题单指南-贪心-P5019 [NOIP2018 提高组] 铺设道路

洛谷题单指南-贪心-P5019 [NOIP2018 提高组] 铺设道路

时间:2024-02-25 10:58:25浏览次数:19  
标签:填满 填充 int 洛谷题 ans long NOIP2018 深度 P5019

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

题意解读:最短时间内填满道路,连在一起的不为0的坑可以一起填

解题思路:

方法1:分治法

对于一段连续不同深度的坑,可以最多连续填的天数是最小深度

在填满最小深度之后,分别针对其左边和右边的区域再进行填充,这就是此题分治法的理论基础。

因此,可以遍历每一个坑,跳过深度是0的坑,把这些坑分组

对于每一组,找到深度最小值,填充直到最小深度被填满,即答案加上最小深度

然后对该组每一个坑,减去被填充的深度(即最小深度),递归处理该区域

100分代码:

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

const int N = 100005;

int d[N], n;
long long ans;

//填充l~r之间的道路,filled表示l~r之间已被填充的深度
void fill(int l, int r, int filled)
{
    bool full = true; //已经填满
    for(int i = l; i <= r; i++) //把已经填的部分减掉
    {
        d[i] -= filled;
        if(d[i]) full = false;
    }
    if(full) return;

    for(int i = l;i <= r; i++)
    {
        int minx = 1e9; 
        int j = i;
        while(d[j] && j <= r) //寻找连续不为0的区间,记录最小值
        {
            minx = min(minx, d[j]);
            j++;
        }
        ans += minx; //可以连续填充直到最小深度填满,即填充天数加上最小深度
        if(i < j) fill(i, j - 1, minx); //递归处理剩下的部分
        
        if(j > r) break;

        i = j;
    }
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> d[i];

    fill(1, n, 0);
    cout << ans;

    return 0;
}

方法2:递推法

从第1个坑开始,如果后一个的深度比前一个深度小,则填充天数不变(为第一个坑的深度)

如果后一个坑的深度比前一个坑的深度大,则填充天数要增加: 后一个坑的深度-前一个坑的深度

依次比较每个相邻高度深度,最后加上第一坑的深度,即得到答案。

100分代码:

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

const int N = 100005;

int a[N], n;
long long ans;

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

    for(int i = 2; i <= n; i++)
    {
        if(a[i] > a[i - 1]) ans += a[i] - a[i - 1];
    }
    ans += a[1];
    cout << ans;

    return 0;
}

 

标签:填满,填充,int,洛谷题,ans,long,NOIP2018,深度,P5019
From: https://www.cnblogs.com/jcwy/p/18032135

相关文章

  • 洛谷题单指南-贪心-P1478 陶陶摘苹果(升级版)
    原题链接:https://www.luogu.com.cn/problem/P1478题意解读:题目的本质是任务安排问题,有n件任务,每件任务耗时不同,在一定的时间内,如何安排任务使得完成的任务越多越好。解题思路:对于这类问题,贪心策略是优先完成容易的。回到摘苹果问题,要优先摘耗费力气小的,如果高度够不着,就跳过,......
  • 洛谷题单指南-贪心-P1106 删数问题
    原题链接:https://www.luogu.com.cn/problem/P1106题意解读:如何删数,让剩下的数最小,贪心选择问题。解题思路:先看样例:1754384第1次遍历:删掉7,剩下15438第2次遍历:删掉5,剩下1438第3次遍历:删掉4,剩下138第4次遍历:删掉8,剩下13,即为结果所以,贪心策略如下:1、遍历每一个数,如果前一......
  • 洛谷题单指南-贪心-P3817 小A的糖果
    原题链接:https://www.luogu.com.cn/problem/P3817题意分析:吃最少的糖果,保证相邻糖果数之和不大于x,需要某种贪心策略。解题思路:依次遍历相邻两盒糖果如果糖果数之和大于x,必须要吃点一部分,使得糖果数之和刚好等于x贪心策略是:优先吃后一盒糖果,因为这样可以更利于后续的判断成立......
  • 洛谷题单指南-贪心-P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
    原题链接:https://www.luogu.com.cn/problem/P1090题意解读:两两合并,是典型的哈夫曼编码算法思想,贪心即可。解题思路:要是合并体力消耗最少,就要让尽可能少的果子越晚合并越好,因此,贪心策略为优先选择数量最少的两堆果子合并,一直到剩下一堆果子,把合并过程中的消耗值累加即可,要快速......
  • 洛谷题单指南-贪心-P1803 凌乱的yyy / 线段覆盖
    原题链接:https://www.luogu.com.cn/problem/P1803题意解读:通过某种贪心策略,使得能参加的比赛数越多越好。解题思路:将比赛按照结束时间由小到大哦排序,贪心策略是优先选择结束时间早的比赛,因为这样能保证后面参加更多其他比赛100分代码:#include<bits/stdc++.h>usingnamespa......
  • 洛谷题单指南-贪心-P1223 排队接水
    原题链接:https://www.luogu.com.cn/problem/P1223题意解读:第i个人接水时,后面的n-i个人就要等待,要使平均等待时间最短,即总等待时间最短,贪心法解题。解题思路:设一共n个人,第i人的接水时间为ti总等待时间为:t1*(n-1)+t2*(n-2)+...+tn直观上,贪心策略应该是让接水时间短的人在前,后面......
  • 洛谷题单指南-递推与递归-P1498 南蛮图腾
    原题链接:https://www.luogu.com.cn/problem/P1498题意解读:观察样例,可以发现,当n=1时,得到最基础的图案:/\/__\当n=2时,将基础图案向下复制两个,并排,然后将之前的图案移到居中的位置/\/__\/\/\/__\/__\当n=3时,再将n=2时的图案向下复制两个,并排,然后将之前的图......
  • 洛谷题单指南-递推与递归-P1228 地毯填补问题
    原题链接:https://www.luogu.com.cn/problem/P1228题意解读:用4种毯子铺满2^k*2^k的区域,留出一个公主位置,输出所有毯子拐角的坐标以及哪种毯子,看起来有点无从下手,可以从k=1,k=2,k=3入手去依次考虑,找到规律,用分治法解决。解题思路:1、当k=1时,即2*2的区域,对于任意一个位置是公主,都......
  • 洛谷题单指南-递推与递归-P1010 [NOIP1998 普及组] 幂次方
    原题链接:https://www.luogu.com.cn/problem/P1010题意解读:输出一个正整数的2的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。解题思路:先看样例,给定整数137,要拆解成2的幂次方之和,先考虑i使得刚好137>=2^i时,i取7,因此2......
  • 洛谷题单指南-递推与递归-P1259 黑白棋子的移动
    原题链接:https://www.luogu.com.cn/problem/P1259题意解读:要打印最终的状态,关键在找到一些变化的规律,直接的暴力搜索复杂度太高。解题思路:从样例出发ooooooo*******--oooooo--******o*oooooo******--o*ooooo--*****o*o*ooooo*****--o*o*oooo--****o*o*o*oooo****--o*o*o*ooo--......