SN祈祷中...

P5019 [NOIP2018 提高组] 铺设道路

本题还有一道姐妹题,两题题意一样,代码也一模一样。

简要题意

给你一个序列,每次选取一个区间对这个区间内所有数都减去 ,使得区间内至少一个数变成 ,重复执行这一过程直到整个序列都为 ,求最小操作次数。

策略分析

本题可以用贪心在 复杂度完成。

操作方法

我们可以从头往尾扫,设第 个位置的值为 ,当第 个位置的值大于第 个位置的值时,我们就要给答案加上 ,否则不操作。为了后面能够正常操作,第一次必须将第一个位置的直接减到

正确性证明

考虑如果 , 那我们在填第 个坑的时候一定可以把第 个坑填上;而当 时,我们填第 个坑的时候又可以顺便把第 个坑填上,由此递推即可得出答案。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstdio>
using namespace std;

namespace SHAWN {
const int N = 1e5 + 7;
int v[N];
long long ans;
int work()
{
int n;
cin >> n;
for (int i = 1; i <= n; ++i) { cin >> v[i]; }
ans = v[1];
for (int i = 2; i <= n; ++i) {
if (v[i] > v[i - 1]) {
ans += (v[i] - v[i - 1]);
}
}
cout << ans << '\n';
return 0;
}
}

signed int main() {
ios :: sync_with_stdio(false);
cin.tie(nullptr);
return SHAWN :: work();
}