2024年9月

【深基2.例12】上学迟到

题目描述

学校和 yyy 的家之间的距离为 $s$ 米,而 yyy 以 $v$ 米每分钟的速度匀速走向学校。

在上学的路上,yyy 还要额外花费 $10$ 分钟的时间进行垃圾分类。

学校要求必须在上午 $\textrm{8:00}$ 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。

由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。

输入格式

一行两个正整数 $s,v$,分别代表路程和速度。

输出格式

输出一个 $24$ 小时制下的时间,代表 yyy 最晚的出发时间。

输出格式为 $\texttt{HH:MM}$,分别代表该时间的时和分。必须输出两位,不足前面补 $0$。

样例 #1

样例输入 #1

100 99

样例输出 #1

07:48

提示

对于 $100\%$ 的数据,$1 \le s,v \le 10^4$。

题解 :

#include<bits/stdc++.h>

using namespace std;

  

int main() {

    double s ,v ,m,t;

    int h;

    scanf("%lf %lf",&s,&v);

    t = s/v + 10;

    h = t / 60;

    m = ceil(t - h*60);

    int mm = (int)m;

    if (mm == 0) printf("%02d:%02d",8 - h,mm);

    else if (mm == 60) printf("%02d:00",7 - h);

    else {

        h = 7 - h;

        mm = 60 - mm;

        if (h < 0) printf("%02d:%02d",h + 24,mm); //当h<0说明就是前一天就出发了,提前的时间超过8h

        else printf("%02d:%02d",h,mm);

    }

    return 0;

}

这题的两个坑就是 1、因为是向上取整用的ceil(),所以当m 是59.5,这样的数时,m会取整为60,这个时候就是要让他变成0,然后小时数减1,第二个坑就是h有可能算出来是负的,因为有可能提前的时间超过了8小时,这个时候就是给他加上24小时,相当于就是24小时去减,变成前一天的出发时间。

要对浮点数进行类似取模的操作,你可以使用math.h库中的fmod函数,它专门用于浮点数的取模运算。

代码如下:

#include <math.h>

m = ceil(fmod(t, 60));

这样,fmod(t, 60)会返回t除以60后的余数,然后再用ceil函数取整。

#include <stdlib.h> 是 C 标准库的一个头文件,它包含了许多与内存分配、进程控制、随机数生成、排序/搜索以及数据类型转换等相关的函数声明。这个头文件在 C 和 C++ 中都被广泛使用。

以下是 stdlib.h 中一些常用的函数和它们的用途:

1. 动态内存分配

  • malloc():分配一块未初始化的内存。

    void* malloc(size_t size);

    例如:

    int* arr = (int*) malloc(10 * sizeof(int));
  • calloc():分配一块内存并将其初始化为零。

    void* calloc(size_t num, size_t size);

    例如:

    int* arr = (int*) calloc(10, sizeof(int));
  • realloc():重新调整已分配的内存块的大小。

    void* realloc(void* ptr, size_t new_size);

    例如:

    arr = (int*) realloc(arr, 20 * sizeof(int));
  • free():释放动态分配的内存。

    void free(void* ptr);

    例如:

    free(arr);

2. 随机数生成

  • rand():生成一个介于 0RAND_MAX 之间的随机整数。

    int rand(void);

    例如:

    int random_value = rand();
  • srand():设置随机数生成器的种子,常用于生成不同的随机数序列。

    void srand(unsigned int seed);

    例如:

    srand(time(NULL)); // 使用当前时间作为种子

3. 进程控制

  • exit():终止程序执行,并返回一个状态码。

    void exit(int status);

    例如:

    exit(0); // 正常退出
  • system():执行系统命令。

    int system(const char* command);

    例如:

    system("ls"); // 在Linux系统中列出目录内容

4. 类型转换

  • atoi():将字符串转换为整数。

    int atoi(const char* str);

    例如:

    int num = atoi("123");
  • atof():将字符串转换为浮点数。

    double atof(const char* str);

    例如:

    double num = atof("123.45");
  • atol():将字符串转换为长整数。

    long atol(const char* str);
  • strtol()strtod():这些函数提供了更灵活的字符串到数值转换方式,可以指定进制或错误处理。

    long int strtol(const char* str, char** endptr, int base);

5. 排序与查找

  • qsort():使用快速排序算法对数组进行排序。

    void qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*));

    例如,排序一个整型数组:

    int compare(const void* a, const void* b) {
        return (*(int*)a - *(int*)b);
    }
    
    qsort(arr, n, sizeof(int), compare);
  • bsearch():使用二分查找在已排序的数组中查找元素。

    void* bsearch(const void* key, const void* base, size_t num, size_t size, int (*compar)(const void*, const void*));

6. 环境变量

  • getenv():获取环境变量的值。

    char* getenv(const char* name);

    例如:

    char* path = getenv("PATH");

总结

#include <stdlib.h> 头文件提供了 C 程序中许多基础功能,包括:

  • 动态内存分配 (malloccallocreallocfree)
  • 随机数生成 (randsrand)
  • 进程控制 (exitsystem)
  • 字符串和数值之间的转换 (atoiatofstrtol)
  • 数组排序和查找 (qsortbsearch)

它是一个通用的、实用的库,几乎在每一个 C 程序中都能找到它的使用场景。

#include<bits/stdc++.h> 是一个在 C++ 编程中经常使用的头文件,它包含了 C++ 标准库中几乎所有的头文件。因此,它在很多竞赛编程或者快速原型开发中被广泛使用,因为它可以避免手动包含每一个单独需要的库文件。

不过,需要注意以下几点:

  1. 不是标准库的一部分#include<bits/stdc++.h> 这个文件并不是 C++ 标准的一部分,它是 GCC(GNU Compiler Collection)编译器的一部分,因此它可能在其他编译器上不可用。例如,Visual Studio 编译器就不支持这个头文件。
  2. 编译速度变慢:因为它包含了几乎所有的标准库头文件,导致编译时间会比你只包含需要的头文件要长。所以在实际的开发中(尤其是在大型项目中),并不推荐使用这个文件。
  3. 良好的编程习惯:在生产环境或大型项目中,最好只包含你确实需要的头文件,这样可以提高代码的可读性、可维护性以及编译速度。

所以,#include<bits/stdc++.h> 虽然非常方便,尤其是在竞赛编程中,但并不是一个“万能库”,也不是推荐在所有情况下使用的库。