计蒜客T1443 看灯笼(C语言实现)

【题目描述】花椰妹喜欢看灯笼。有一条铁路,长度为L-1,最左端为1号点,最右端为L号点。每两个相邻点距离为1。现在有的单位点上挂着灯笼,这些点的编号p满足是某个整数v的倍数。但是这条铁路上还有一辆火车,它的车尾在点x右侧,车头在点y左侧(假设铁路从左向右延伸),它会覆盖点x和y以及它们之间的部分,使得花椰妹看不到这个区间内的灯笼。花椰妹会去t条不同的铁路上看灯笼。对于每一条铁路你都可以知道L,v,x,y四个信息。现在花椰妹问你她在每条铁路上能看见几个灯笼。
【输入格式】输入的第一行包含一个整数t(1≤t≤10000)。以下t行每一行四个整数L,v,x,y(1≤L,v≤1000000000,1≤x≤y≤L)。
【输出格式】每一行输出对应询问的答案,总共t行。
思路: 一开始的想法是直接循环,总共的灯笼数减去被挡住的灯笼数,显然,超时啦!然后就考虑怎么不使用循环,计算灯笼数量。
【C语言实现】

# include 
int main()
{
    int t;
    scanf("%d", &t); // 输入
    for (int i = 0; i < t; ++i) {
        int L, v, x, y;
        scanf("%d%d%d%d", &L, &v, &x, &y); // 输入
        int p = (x - 1) / v; // x左侧灯笼,即[1, x-1],这些是可以看见的灯笼的数量
        int q = y / v; // y左侧灯笼, 即[1, y],这些包括能看见的灯笼的数量(即x左侧灯笼)加上被火车挡住的灯笼的数量(即[x, y])
        int r = L / v - (q - p); // 能看见的灯笼数是总共的灯笼数量减去被挡住的灯笼的数量
        
        printf("%d\n", r); // 输出
    }
    return 0;
}

你可能感兴趣的:(c语言)