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

思考:
这一道题和上面一道题(或者是前面的某一道题)一样,在进行除法处理的时候有一些小坑。具体说来,由于除法后得到小数的情况应该向上取整,而计算机会向下取整,中间相差一个+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

浙公网安备 33010602011771号