ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

蓝桥杯备赛--AcWing 668. 游戏时间2

2022-01-30 22:00:05  阅读:168  来源: 互联网

标签:杯备赛 668 int 备赛 d% 样例 分钟 蓝桥 时间


文章目录

蓝桥杯备赛–AcWing 668. 游戏时间2

lanqiao备赛系列说明

  • 这是第一篇备赛blog 本次备赛我使用的是y总的ACwing刷题网站进行学习备赛(也算是给y总打广告了hhh)
  • 本系列的刷题还是希望以赛促学 在备赛的基础上激励自己学习更多的知识。
  • 其他不多赘述了 希望可以获奖

原题链接

题目

题目描述

读取四个整数 A,B,C,D,用来表示游戏的开始时间和结束时间。

其中 A 和 B 为开始时刻的小时和分钟数,C 和 D 为结束时刻的小时和分钟数。

请你计算游戏的持续时间。

比赛最短持续 1 分钟,最长持续 24 小时。

输入格式

共一行,包含四个整数 A,B,C,D。

输出格式

输出格式为 O JOGO DUROU X HORA(S) E Y MINUTO(S),表示游戏共持续了 X 小时 Y 分钟。

数据范围

0≤A,C≤23,
0≤B,D≤59
输入样例1:

7 8 9 10

输出样例1:

O JOGO DUROU 2 HORA(S) E 2 MINUTO(S)

输入样例2:

7 7 7 7

输出样例2:

O JOGO DUROU 24 HORA(S) E 0 MINUTO(S)

输入样例3:

7 10 8 9

输出样例3:

O JOGO DUROU 0 HORA(S) E 59 MINUTO(S)

下面进行解法思路的详解(这里提供三种思路及解决方案)

一、直接按照时间属性进行讨论(最复杂考虑的情况最多)

1. 思路

对于此题目来说 如果根据时间属性进行讨论 又可以分为两大子属性–小时和分钟。
对于这样两个属性进行分析时,都需要考虑如果开始时间的分钟比结束时间分钟少的情况(这种情况就需要在小时位上借一);
那么针对两种情况进行简单分析可知 对分钟进行分类讨论更方便(情况容易合并处理+小时需要减一也是分钟情况进行控制的);

2. 图示分析

  1. 对hour的讨论
    对hour的讨论
  2. 对min的讨论
    对min的讨论
    对上面两种情况分析之后容易发现,对分钟进行分析最为科学有效(即按照是否进行“借位”进行分类)。

3. 实现代码(C++)

# include <iostream>

using namespace std;

int main(void){
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);

    int hour,min;
    if(b<d){
        min = d-b;
        if (a<=c) hour = c-a;
        else hour = (24-a)+c;
    }else if (b>d) {
        min = (60-b)+d;
        if (a<c) hour = c-a-1; //注意此处的所有情况都需要减一(对小时来说)因为分钟的缺失需要借1
        else hour = (23-a)+c;
    }else {
        min = 0;
        if (a<c) hour = c-a;
        else hour = (24-a)+c;
    }
    printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)",hour,min);

    return 0;
}

二、直接把时间问题间接转化为数量问题

1. 思路

主要思路就是绕过小时和分钟这两个不同单位之间的换算,把两个时间全部换算为分钟制度,以此避免了借位这一头疼的问题。

2. 具体解决

具体解决又两个方法,个人更推荐第二种(也就是y总的处理方式)

  • 对两个时间点换算后的分钟值进行比较分类;
  • 对两个时间点换算后做差的值的正负进行处理(直接对与spend_time的分类更为优雅,也体现了单出口这一特性)。

3. 实现代码(C++)

#include <iostream>

using namespace std;

int main(void){
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);

    int t1,t2,t;
    //t1为第一个时间换算为分钟 
    //t2为第二个时间换算为分钟
    //t为相差时间的分钟 
    t1 = a*60+b;
    t2 = c*60+d;

    if(t1<t2){
        t = t2-t1;
        printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)",t/60,t%60);
    }else{
        t = (1440-t1)+t2;
        printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)",t/60,t%60);
    }

    return 0;
}
//y总的代码 666 直接把目光放到对于spend_time的处理上
#include <iostream>

using namespace std;

int main(void){
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    int start,end,spend_time;
    
    start = a*60+b;
    end = c*60+d;
    spend_time = end-start;

    if(spend_time<=0) spend_time += 1440;

    printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)",spend_time/60,spend_time%60);

    return 0;
}

over

标签:杯备赛,668,int,备赛,d%,样例,分钟,蓝桥,时间
来源: https://blog.csdn.net/weixin_46383360/article/details/122756126

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有