ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P5019-贪心&搜索

2022-04-12 17:01:05  阅读:159  来源: 互联网

标签:道路 int 区间 depth 搜索 P5019 下陷 road 贪心


P5019

春春是一名道路工程师,负责铺设一条长度为n的道路。

铺设道路的主要工作是填平下陷的地表。整段道路可以看作是 n块首尾相连的区域,一开始,第 i块区域下陷的深度为 d_i

春春每天可以选择一段连续区间[L,R] ,填充这段区间中的每块区域,让其下陷深度减少1。在选择区间时,需要保证,区间内的每块区域在填充前下陷深度均不为0

春春希望你能帮他设计一种方案,可以在最短的时间内将整段道路的下陷深度都变为0

  • 输入格式

输入文件包含两行,第一行包含一个整数 n,表示道路的长度。 第二行包含 n个整数,相邻两数间用一个空格隔开,第i个整数为d_i

  • 输出格式

输出文件仅包含一个整数,即最少需要多少天才能完成任务。

  • 样例
6   
4 3 2 5 3 5 
  • 输出样例
9

本题用两种方法解决:

贪心

  • 显然,本题是要求我们找到填路最小的次数。题目是让找最小,为了简单,我们不妨朝找最大去想

  • 首先,我们可以想到一种极端情况:

    • 即,路上的坑都深为4,那么一共就只用填四次

      4 4 4 4
      
    • 当遇到最大的数时,无论怎样都得填上 最大的数

      4 3 2 1 -> 4
      
    • 所以我们不妨直接从第二个数一波遍历,如果该数比前一个大,大了几,就给总次数加几

      for(int i = 2; i <= road; i++)
      	ans += depth[i]-depth[i-1]
      
    • 最后再加上之前没加的第一个数

      ans += depth[1];
      
  • 以下为总代码:

    #include <bits/stdc++.h>
    using namespace std;
    int road;
    int depth[100000];
    int cnt = 0;
    
    int main()
    {
        cin >> road;
        for(int i = 1; i <= road; i++)
            cin >> depth[i];
        for(int i = 2; i <= road; i++) {
            if(depth[i] > depth[i-1])
                cnt += depth[i]-depth[i-1];
        }
        cout << cnt+depth[1];
        return 0;
    }
    

    搜索

  • 题目本来说的就是在原来的区间中,找一个子区间,然后减去同样的数,因此我们不妨:

    • 1.找一个区间
    • 2.将此区间最小的数减成0
    • 3.以此0为分界点,在0前的区间找最小,在0后的区间找最小
    • 4.重复以上过程,直到子区间长度为0
  • 以下为代码:

    #include <bits/stdc++.h>
    using namespace std;
    int road,Min,mark;
    int depth[1000000];
    int cnt = 0;
    
    void operate(int head,int tail) {
        Min = 0x7fffffff;
        for(int i = head; i <= tail; i++) {
            if(depth[i] < Min) {
                Min = depth[i]; mark = i;
            }
        }
        for(int i = head; i <= tail; i++)
            depth[i] -= Min;
        cnt += Min;
    }
    
    void search(int head,int tail) {
        if(tail < head) return;     //
        operate(head,tail);
        search(mark+1,tail);
        search(head,mark-1);
    }
    
    int main()
    {
        cin >> road;
        for(int i = 1; i <= road; i++)
            cin >> depth[i];
        search(1,road);
        cout << cnt;
        return 0;
    }
    

标签:道路,int,区间,depth,搜索,P5019,下陷,road,贪心
来源: https://www.cnblogs.com/sungoesdown/p/16135935.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有