CodeForces - 1066A Vova and Train(思维)

题目刚刚接触的时候不是很好理解,然后看样例靠猜的话…慢慢也就知道它什么意思。
一开始感觉挺简单,
总灯笼数量好求,因为灯笼的标号是从1开始的,total = L/v,有点不好想的是区间的灯笼数量
然后暴力…很快就超时了
啧啧啧…果然不能想那么简单。
然后对暴力进行剪枝,还是超时…
果断换思路,不能暴力做
在这里插入图片描述
然后就开始发散思维,等差数列??两数之间的灯笼个数???总之想了好多没用的…不知不觉就思维僵硬了,看着组里半小时就a出来的大佬很是佩服。
忽然,想到总灯笼的求法,我现在所缺少的只是区间内的灯笼数量即[ a , b] 内的灯笼数。
如果把区间展开1—a, 1—b
.

如图所示,阴影部分的就是区间的灯笼数(看不到的)
在这里插入图片描述
那么1—a的灯笼数就是 a/v,1—b的灯笼数就是b/v
b/v - a/v就是区间的灯笼数
区间灯笼数 = b/v - a/v.
不过要注意的是
对于样例 10 2 4 6
a = 4, b = 6;
1—a的灯笼数为2(2,4)
1—b的灯笼数为3(2,4,6)
如果相减发现只有1,把灯笼4给减掉了。对于区间左端点如果有灯笼的话要把减掉的加上
因此需要特判一下

 if(a%v==0) cnt = b/v - a/v + 1; //失去的在加回来

然后吐槽一句,不知不觉4点了,一下午就一个20行代码的弱智题,
所以你要相信你永远比作者聪明!
在这里插入图片描述
上代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int L, v, a, b;
        scanf("%d%d%d%d",&L,&v,&a,&b); //不知道怎么回事,scanf输入要比cin快
        int total = L/v, cnt1, cnt2, cnt;
        cnt1 = a/v;
        cnt2 = b/v;
        cnt = cnt2-cnt1;
        if(a%v==0) cnt++;
        cout << total-cnt << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值