A - Bridge and Sheets
- 知识点:枚举
- 时间复杂度: O ( n ) O(n) O(n)
⚠️:
- 注意将第一次判断和中间分开,中间的判断比第一次判断要多减一个m。
- 注意中间判断和最后结尾判断分开,如果 a [ n ] + m < l a[n]+m<l a[n]+m<l的话,说明还是无法全部覆盖,还需要再铺一块,但是中间如果正好空了w块,也是可以填的。
- 注意边界问题(中间的if去掉之前我一直不明白是>=还是=)。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
const int N = 1e5 + 10;
long long n, l, w;
long long a[N];
int main(){
scanf("%lld%lld%lld", &n, &l, &w);
long long res = 0;
for (int i = 0; i < n; i ++){
scanf("%lld", a + i + 1);
}
if (a[1] > 0) res += (a[1] + w - 1) / w; //如果第一个起始点不在0,那必然要自己铺tarps。长度为(a[1] - 0) / w向上取整。
for (int i = 1; i < n; i ++){
if (a[i + 1] - a[i] >= w) //这个if可以不加
res += (a[i + 1] - a[i] - 1) / w; //这里其实少写了一个 + w - w,其中 + w和后面的-1凑成了向上取整,- w和前面的-a[i]凑成上一个tarps结尾的地方。
}
if (l - w > a[n]) res += (l - a[n] - 1) / w;//结束判断,这里结束判断和中间的判断其实不太一样,不同之处在于中间的if可以不加,而后面的>表示没铺到结尾需要继续铺。
printf("%lld\n", res);
return 0;
}