文章

【GESP】C++一级真题 luogu-B4257 [GESP202503 一级] 图书馆里的老鼠

GESP C++一级真题,整数除法运算,难度★☆☆☆☆。

luogu-B4257 [GESP202503 一级] 图书馆里的老鼠

题目要求

题目描述

图书馆里有 $n$ 本书,不幸的是,还混入了一只老鼠,老鼠每 $x$ 小时能啃光一本书,假设老鼠在啃光一本书之前,不会啃另一本。请问 $y$ 小时后图书馆里还剩下多少本完整的书。

输入格式

三行,第一行一个正整数 $n$,表示图书馆里书的数量;

第二行,一个正整数 $x$,表示老鼠啃光一本书需要的时间;

第三行,一个正整数 $y$,表示经过的总时间;

输入数据保证 $y$ 小时后至少会剩下一本完整的书。

输出格式

一行,一个整数,表示 $y$ 小时后图书馆里还剩下多少本完整的书。

输入输出样例 #1

输入 #1

1
2
3
10
2
3

输出 #1

1
8

输入输出样例 #2

输入 #2

1
2
3
5
2
4

输出 #2

1
3

说明/提示

对于所有测试点,保证 $1\leq n,x,y\leq 1000$,保证 $y$ 小时后至少会剩下⼀本完整的书。


题目分析

解题思路

本题的解题思路如下:

  1. 问题分析:
    • 给定图书馆里的书本数量n、老鼠啃完一本书需要的时间x和经过的总时间y
    • 需要计算y小时后剩余的完整书本数量
    • 老鼠在啃完一本书之前不会啃另一本书
  2. 解题方法:

    方法一:通过逻辑判断是否整除

    • 核心思路:
      • 用总时间y除以啃一本书的时间x,得到已经被啃完的书的数量
      • 如果y能被x整除,说明最后一本书已经被啃完
      • 如果y不能被x整除,说明最后一本书正在被啃,也要算作不完整
    • 实现公式:
      • 能整除时:剩余数量 = n - y/x
      • 不能整除时:剩余数量 = n - y/x - 1

    方法二:利用向上取整公式

    • 核心思路:
      • 使用向上取整计算已经不完整的书的数量
      • 总时间除以单本时间向上取整,就是不完整的书的数量
    • 实现公式:
      • 剩余数量 = n - ⌈y/x⌉
      • 其中⌈y/x⌉可以用(y + x - 1)/x实现

    方法三:使用cmath库的ceil函数

    • 核心思路:
      • 直接使用C++标准库中的ceil函数进行向上取整
      • 将除法结果转换为double类型以确保精确计算
    • 实现公式:
      • 剩余数量 = n - ceil(y/x)
      • 需要将y转换为double类型避免整数除法
  3. 实现要点:
    • 注意输入数据的范围:1 ≤ n,x,y ≤ 1000
    • 题目保证y小时后至少会剩下一本完整的书
    • 整数除法运算时注意处理向上取整的情况

复杂度分析:

  • 时间复杂度:$O(1)$,只需要简单的算术运算
  • 空间复杂度:$O(1)$,只需要存储几个整型变量


方法一:通过逻辑判断是否整除

方法一示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

int main() {
    // 定义变量存储书的数量、啃一本书所需时间和总时间
    int n, x, y;
    // 从标准输入读取三个整数
    std::cin >> n >> x >> y;
    // 计算剩余完整的书的数量
    // 如果总时间能被啃一本书的时间整除,说明最后一本书已经被啃完
    if (y % x == 0) {
        std::cout << n - y / x;
    } 
    // 如果不能整除,说明最后一本书正在被啃,也要算作不完整
    else {
        std::cout << n - y / x - 1;
    }
    return 0;
}

方法二:利用公式计算

方法二示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

int main() {
    // 定义变量存储书的数量(n)、啃一本书所需时间(x)和总时间(y)
    int n, x, y;
    // 从标准输入读取三个整数
    std::cin >> n >> x >> y;
    // 计算剩余完整的书的数量
    // 公式:总数 - 向上取整(总时间/单本时间)
    // (x + y - 1) / x 等价于 ceil(y/x),用于向上取整
    std::cout << n - (x + y - 1) / x;
    return 0;
}

方法三:利用ceil函数

方法三示例代码

1
2
3
4
5
6
7
8
9
#include <iostream>#include <iostream>
#include <cmath>

int main() {
    int n, x, y;
    std::cin >> n >> x >> y;
    std::cout << n - std::ceil((double)y / x);
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权