[Editorial] AtCoder Regular Contest 134

A - Bridge and Sheets

  • 知识点:枚举
  • 时间复杂度: O ( n ) O(n) O(n)

⚠️:

  1. 注意将第一次判断和中间分开,中间的判断比第一次判断要多减一个m。
  2. 注意中间判断和最后结尾判断分开,如果 a [ n ] + m < l a[n]+m<l a[n]+m<l的话,说明还是无法全部覆盖,还需要再铺一块,但是中间如果正好空了w块,也是可以填的。
  3. 注意边界问题(中间的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值