洛谷P5019 铺设道路(NOIP提高组 D1T1)题解 贪心

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

解题思路:

这道题目采用两种贪心思想都是可以解决的:

  1. 自底向上将一块块连通的位于同一层的填上;
  2. 从左到右将一段段最长的一段填上去。

这里基于第2种思想。

对染理论上来说 (n imes d le 10^9) 暴力可以过,但是我只拿了80分。

所以可以批量更新,也就是说如果是下面这一组数据:

2,6,6,6,6,2

那么我可以将将区间 ([2,4]) 范围批量+4,需要4步。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010, INF = (1<<29);
int n, d[maxn], dmax, ans;
void handle(int L, int R, int d1) {
    if (L > R) return;
    int i = L;
    while (i <= R && d[i] == d1) i ++;
    if (i > R) return;
    int j = i;
    while (j+1 <= R && d[j+1] > d1) j ++;
    int d2 = INF;
    for (int k = i; k <= j; k ++) d2 = min(d2, d[k]);
    ans += d2 - d1;
    handle(i, j, d2);
    handle(j+1, R, d1);
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++) {
        scanf("%d", d+i);
        dmax = max(dmax, d[i]);
    }
    handle(1, n, 0);
    printf("%d
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/quanjun/p/13137699.html