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

题面:
image
思考:
这一道题和上面一道题(或者是前面的某一道题)一样,在进行除法处理的时候有一些小坑。具体说来,由于除法后得到小数的情况应该向上取整,而计算机会向下取整,中间相差一个+1;同时存在完全除尽的情况,这种情况不需要+1,所以需要分情况讨论:

int t = 0;
if (s%v==0) {
    t = s/v+10;
} else {
    t = s/v+1+10;
}

得到了需要提前的时间(单位:分钟)后,倒推具体的出发时间也需要考虑很多的特判。思路是:先从总的分钟计算出需要多少小时和多少分钟,然后从8点往前推,先直球剪掉用掉的小时数(其中分为隔天和当天两种情况),然后再考察分钟零头。如果有零头就像减法一样从小时那里借一位来减。
具体的已经在代码的注释中写出:

#include <stdio.h>

int main ()
{
    int s, v;
    scanf("%d%d",&s,&v);
    int t = 0;
    if (s%v==0) {
        t = s/v+10;
    } else {
        t = s/v+1+10;
    }
    int h = t/60;
    int m = t%60;
    int hh=0,mm=0;
    if (h<8) {//在当天出发
        hh = 8-h;//减去用去的小时数
        if (m!=0) {//如果还有分钟零头
            hh-=1;//用小时来补偿
            mm=60-m;
        }
    } else if (h>=8 && h<=24) {//前一天出发
        hh = 24-(h-8);//减去用去的小时数
        if (m!=0) {//如果还有分钟零头
            hh-=1;//用小时来补偿
            mm=60-m;
        }
    } 
    //else if (h==24 && m==0) {//如果是24则直接时间回溯
    //    hh=8;mm=0;
    //}
    //输入补0:如果有个位数字存在则直接输出0+数字
    if (hh<=9) {
        printf("0%d:",hh);
    } else {
        printf("%d:",hh);
    }
    if (mm<=9) {
        printf("0%d",mm);
    } else {
        printf("%d",mm);
    }
    return 0;
}

说起来这么屑的代码居然把所有测试点一次AC过去了2333

posted @ 2022-04-20 00:39  Akiho  阅读(70)  评论(0)    收藏  举报