考研复试刷题第八天:日期累加 【日期问题】

news2025/1/18 6:48:57

本来以为和上次那个简单题一样的,没啥难度,就是循环就完事了,结果超时了

超时代码: 

#include <iostream>
using namespace std;

//平年各个月份都多少天?
int mouths [13] = {
    0,31,28,31,30,31,30,31,31,30,31,30,31
};

//判断此年是闰年还是平年 是润年就返回一,不是则返回0
int judge_year(int year){
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
        return 1;
    }
    return 0;
}

//返回某年某月一共多少天?
int dayOfmouth(int year ,int mouth){
    if(mouth == 2 && judge_year(year) == 1) 
    return  mouths[mouth] + 1;
    else return mouths[mouth];
}

int main(){
    int year , day , mouth , lenOfday;
    int n;
    cin>>n;
    while(n--){
        cin>>year>>mouth>>day>>lenOfday;
        int mouth1 = mouth , day1 = day;
        while( lenOfday-- ){
            day1 ++;
//            cout<<day1<<"-"<<mouth<<endl;
            if(day1 > dayOfmouth(year,mouth1)){
                day1 = 1;
                mouth1++;
            if(mouth1 > 12){
                mouth1 = 1;
                year++;
            }   
            }
            
        }
        printf("%04d-%02d-%02d\n",year,mouth1,day1);
    }
    return 0;
}

 超时样例:

1000
2091 6 29 634830
2115 4 21 22027
1946 8 9 854350
2056 6 3 715810
2782 9 4 796922
1699 12 15 184655
1247 6 11 638360
2408 8 21 879227
1147 8 25 773890
1057 8 7 348039
2371 10 29 935478
1912 2 27 999934
2427 9 14 92640
1983 3 7 348930
1499 8 5 596979
2796 5 26 515616
1792 8 30 740722
2747 11 11 330057
1773 4 30 875893
2372 7 22 371697
1237 8 18 586546
1169 11 20 513740
1998 4 23 346024
2745 3 31 84795
1305 11 9 95146
1284 2 14 597099
2341 9 5 395133
2033 8 10 551638
1762 12 25 347636
2917 3 19 74113
1398 5 28 21974
2893 11 1 272578
2217 1 1 243153
1028 5 25 518800
2562 4 23 547192
1630 9 2 579462
2979 7 23 923800
2694 11 6 646394
2350 8 7 235079
2382 7 16 704178
1630 4 8 192872
1105 2 22 39505
1984 1 20 66417
1723 9 26 247094
1245 12 23 987206
1818 12 20 732915
2037 10 8 731946
1449 11 3 754965
1859 12 31 523183
2975 11 5 619971
2013 11 25 928027
2995 2 22 298059
1720 10 10 620280
1448 7 15 204194
1020 5 15 225758
2512 2 9 632627
2395 11 19 252286
2489 6 29 852785
1496 10 13 601134
1779 11 5 737765
1567 7 7 836958
1711 1 1 277110
2968 5 13 291651
2567 3 1 881136
2201 1 21 857540
2550 3 27 754188
1671 3 17 235695
1803 7 2 489657
1342 1 13 280616
2795 6 14 297831
2111 7 31 142825
1564 6 14 212124
2201 4 17 961987
2607 6 6 124318
1037 12 11 147447
2941 3 7 541281
1262 9 16 540441
1499 3 14 490286
1797 11 10 71749
1790 4 22 308694
2083 4 29 575426
2681 6 23 604999
1022 12 27 720711
2029 9 27 550751
2534 4 17 273081
2625 6 11 689417
2242 11 26 964762
1021 1 13 433612
2822 6 17 356140
1986 4 13 329179
2159 12 24 252720
2161 10 28 492323
2064 4 4 3405
1823 3 23 441953
2691 12 14 727889
1796 3 7 672592
1885 6 14 976246
2166 11 17 283102
1476 1 12 234669
2190 11 2 57086
1503 2 26 543206
1010 2 28 704316
2228 3 19 847779
1150 7 8 275086
1385 11 25 176706
2363 9 11 401377
2015 6 29 590936
2885 11 14 922651
1710 9 2 543485
2452 11 6 101538
1912 10 10 924722
1508 2 28 903629
1993 11 23 905684
1376 2 20 557365
1153 8 9 186995
2449 5 31 813330
2416 4 7 842671
2578 8 11 85095...

 

这段代码会被执行多少次? 

拿出计算器一算 6后面8个0,这不完全超过了y总说的10的八次方

 怪不得超时,看来要优化一下了。

看了y总的视屏,其实就是先枚举年数,再枚举天数。于是我写了下面这段代码

int get_days_year(int year){
    return judge_year(year)+365;
}

while(lenOfday > get_days_year(year)){
      lenOfday = lenOfday - get_days_year(year);
      year ++;
}

结果答案错误,其实是我想错了,往上加一年不是看今年有多少天,而是看下一年的今天到今年的今天中间差了多少天。

 我们需要通过不同的月份来判断,如果今年我们输入的样例是在1月1号到2月28日之间的,那么我们需要跳过的是当年是否为闰年,但是如果是3月1日到12月31日之间的,我们需要跳过的是下一年的2月,所以我们要判断下一年是否为闰年。

于是上面的代码我们就改为:

int get_days_year(int year,int mouth){
    if(mouth<=2)return judge_year(year)+365;
    return judge_year(year + 1)+365;
}

while(lenOfday > get_days_year(year,mouth1)){
      lenOfday = lenOfday - get_days_year(year,mouth1);
      year ++;
}

有人就会问了,万一我这次输入的样例正好是2月29呢?我今年虽然是闰年但是我已经不用跳过这一天了啊,所以应该算平年,没错,确实是这样,但是如果把这个逻辑加入这个函数里就不这个函数的功能就不清楚了,或者说逻辑比较乱,所以我们为了图方便就在枚举之前先做一次特判。

if(mouth1 == 2  && day1 == 29) lenOfday--, mouth1++ , day1 = 1;

于是我们就可以写出代码。 

#include <iostream>
using namespace std;

//平年各个月份都多少天?
int mouths [13] = {
    0,31,28,31,30,31,30,31,31,30,31,30,31
};

//判断此年是闰年还是平年 是润年就返回一,不是则返回0
int judge_year(int year){
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
        return 1;
    }
    return 0;
}

//返回某年某月一共多少天?
int dayOfmouth(int year ,int mouth){
    if(mouth == 2 && judge_year(year) == 1) 
    return  mouths[mouth] + 1;
    else return mouths[mouth];
}

//除去特判情况算出今年某个日子到下一年同一天中间隔了多少天
int get_days_year(int year,int mouth){
    if(mouth<=2)return judge_year(year)+365;
    return judge_year(year + 1)+365;
}
int main(){
    int year , day , mouth , lenOfday;
    int n;
    cin>>n;
    while(n--){
        cin>>year>>mouth>>day>>lenOfday;
        int mouth1 = mouth , day1 = day;
        //特判
        if(mouth1 == 2  && day1 == 29) lenOfday--, mouth1++ , day1 = 1;
        
        //遍历年份,优化部分
        while(lenOfday > get_days_year(year,mouth1)){
            lenOfday = lenOfday - get_days_year(year,mouth1);
            year ++;
        }
        while( lenOfday-- ){
            day1 ++;
            if(day1 > dayOfmouth(year,mouth1)){
                day1 = 1;
                mouth1++;
            if(mouth1 > 12){
                mouth1 = 1;
                year++;
            }   
            }
            
        }
        printf("%04d-%02d-%02d\n",year,mouth1,day1);
    }
    return 0;
}

对了,最后讲一下为啥这个代码就可以不超时了:因为题目给出lenOfday是不会超过1的六次方的。我们假设个最坏的情况:每个测试样例都是1的六次方,但是我们在枚举天数的前面先枚举了年份,也只有2739次,然后后面枚举天数也最多365天,加起来3200不到,然后再最坏的打算,有1000个样例点,那么就是32后面五个零那么也是远远小于下边界10的7次方的。所以不超时。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring事务深度学习

jdbcTemp Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作。 JdbcTemp的使用 对应依赖 <!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><ve…

已知相机内外参通过COLMAP进行稀疏/稠密模型重建操作过程

在https://colmap.github.io/faq.html#reconstruct-sparse-dense-model-from-known-camera-poses 中介绍了已知相机内外参如何通过COLMAP进行稀疏和稠密模型重建的过程&#xff0c;这里按照说明操作一遍&#xff1a; 在instant-ngp中&#xff0c;执行scripts/colmap2nerf.py时…

request页面代码逻辑

一. 封装请求基地址 在src目录下面建一个api文件夹 然后在文件夹里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 在src目录新建发送请求的页面并导入封装好的请求 然后把这个请求封装成一个函数&#xff0c;这个函数里需要传入两个参数。 …

Xavier或TX2配置ipv4地址

输入ifconfig查看本地ipv4地址&#xff0c;发现并没有设置&#xff0c;无法通过以太网与其他主机通信。下面来配置系统的以太网地址。 1、编辑文件/etc/network/interfaces: sudo gedit /etc/network/interfaces2、用下面的内容来替换有关eth0的行&#xff0c;并且将ip地址等信…

Java中抽象类和接口的区别,一文弄懂,图文并茂

目录 前言 1. 抽象类 1.1 定义 1.2 示例 1.3 使用 1.3.1代码-抽象类 1.3.2代码-抽象类继承类使用 1.3.3输出结果为&#xff1a; 1.4UML类图展示类间的关系 2. 接口 2.1 定义 2.2 示例 2.2.1代码-接口 2.3 使用 2.3.1代码-接口实现 2.3.2代码-接口实现类使用 2…

【Linux】驱动内核调试,没有几板斧,怎么能行?

目录 前言&#xff1a; 一、基础打印工具 &#xff08;1&#xff09;printk---最常用 ①Log Buffer: ②Console&#xff1a; ③RAM Console&#xff1a; &#xff08;2&#xff09;动态打印 ①动态打印与printk之间的区别联系 ②动态打印常用的例子 ③动态打印转为pri…

C语言实战 - 贪吃蛇(图形界面)

由于本人精力有限&#xff0c;暂时先把素材和代码放上&#xff0c;等以后有空再补教程。 目录 效果预览 准备工作 EasyX图形库 音频素材 代码编写 Transfer.h文件 game.cpp文件 main.c文件 效果预览 先来看一下最终成品效果 贪吃蛇图形界面 准备工作 EasyX图形库 这…

[230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45

Invading Algae 目录 Invading Algae 全文 题目 Paragraph 1 P1 段落大意 问题1 Paragraph 2 P2 段落大意 问题2 *问题3* Paragraph 3 P3 段落大意 问题4 Paragraph 4 P4 段落大意 Paragraph 5 P5 段落大意 *问题5* *问题6* 问题7 问题8 问题9…

【计算机组成原理】第二章 运算方法和运算器

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录第一章 计算系统概论 **第二章 运算方法和运算器** 第三章 多层次的存储器…

C++移动构造函数

一、背景 拷贝构造函数又分为浅拷贝和深拷贝&#xff1a; 浅拷贝&#xff1a;当类中有指针时&#xff0c;直接复制&#xff0c;会使多个指针指向同一块内存&#xff0c;导致重复析构 深拷贝&#xff1a;每次都是重新赋值一份&#xff0c;这种方法内存消耗较大 因此C就提供…

一觉醒来Chat gpt就被淘汰了

目录 什么是Auto GPT&#xff1f; 与其他语言生成模型相比&#xff0c;Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大&#xff0c;它可以应用于各种文本生成场景&#xff0c;包括但不限于以下几个方面 Auto GPT的历史 马斯克说&#xff1a;“ChatGPT 好得吓…

【C++从0到王者】第三站:类和对象(中)赋值运算符重载

文章目录 一、运算符重载1.运算符重载的使用2.运算符重载的注意事项 二、赋值运算符重载1.复制拷贝与拷贝构造2.赋值运算符重载的格式3.赋值运算符重载的实现4.赋值运算符重载的注意事项 一、运算符重载 1.运算符重载的使用 当我们实现一个日期类的时候&#xff0c;我们有时候…

一个*泰NL18-20漏电保护器的拆解

一个*泰NL18-20漏电保护器的拆解&#xff0c;购买很早了&#xff0c;损坏&#xff0c;按test按钮无动作&#xff0c;昨天用一个雷*的63A漏保替换了。 NL18-20的电流只有20A。显然不适合现在的运用了。而且是无灭弧装置&#xff0c;所以分断能力有限。 好奇&#xff0c;拆开来看…

C++PrimerPlus第四章编程题

编程题 题目总览 编程题题解 题目要求输入四次信息&#xff0c;有四次交互的输入&#xff08;in&#xff09;&#xff0c;最后在一口气列举出来。同时对于firstname与lastname进行了拼接&#xff0c;而且对于输入的成绩进行降级操作。同时对于名字name的要求是可以输入多个单词…

使用Flink MySQL cdc分别sink到ES、Kafka、Hudi

环境说明 [flink-1.13.1-bin-scala_2.11.tgz](https://archive.apache.org/dist/flink/flink-1.13.1/flink-1.13.1-bin-scala_2.11.tgz)[hadoop-2.7.3.tar.gz](https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz)[flink-cdc-connectors](https:…

【Base64】前后端图片交互(2)

使用Base64去处理前后端图片交互 一、Base64编码介绍二、java.util.Base64 介绍源码分析编码译码 三、使用 Base64 前后端图片交互&#xff08;实操&#xff09;四、效果展示五、总结 绪论&#xff1a;在此之前小编发过一次前后端交互处理的方式&#xff1a;前后端图片交互的简…

深度学习之图像分类(三):VGGNet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;Mobile…

Windows磁盘空间不够,发现DriverStore文件夹特别大

正想安装一个新的VS2022&#xff0c;但是发现C盘的空间已经不足&#xff0c; 显示为红色了&#xff0c;这样不能安装。只好找一下C盘的空间为什么不足了&#xff0c;后来发现有一个目录特别大&#xff0c;这个目录就是DriverStore文件夹。由于电脑已经运行5年了&#xff0c;也…

Java的线程

介绍线程 线程是系统调度的最小单元&#xff0c;一个进程可以包含多个线程&#xff0c;线程是负责执行二进制指令的。 每个线程有自己的程序计数器、栈&#xff08;Stack&#xff09;、寄存器&#xff08;Register&#xff09;、本地存储&#xff08;Thread Local&#xff09…

Linux的基本权限

基本权限 1.权限的概念2.Linux上的用户分类2.1. 如何切换用户&#xff1f; 3.Linux的权限管理3.1. 文件访问者的分类&#xff08;人&#xff09;3.2.文件类型和访问权限&#xff08;文件属性&#xff09;3.2.1. 文件类型3.2.2. 基本权限 3.3. 文件权限值的表示方法3.3.1. 字符表…