洛谷 P5707 题解

这篇博客介绍了如何解决洛谷P5707问题,涉及计算在不迟到的前提下,以给定速度行走一定路程并在途中花费额外时间进行垃圾分类的最晚出发时间。博主提供了问题解析和AC代码,通过分析路程、速度和额外时间来确定出发时间,并确保在8:00前到达学校。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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

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

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

输入格式

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

输出格式

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

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

输入输出样例

输入 #1复制

100 99

输出 #1复制

07:48

解析

可以用成堆的分支结构.

int n,m,t,ti,tj,tk;
    int hour = 60;
    cin>>n>>m;

n,m代表路程和时间,其他变量稍后再说.

if (n % m == 0) {
    t = n / m + 10;
}
else if (n % m != 0)    {
    t = n / m + 11;
}
if (t % 60 == 0)    {
    ti = t / 60;
}
else if (t % 60 != 0)   {
    ti = t / 60 + 1;
}

其中,m代表每分钟行进多少米,因而用n mod m 求出值,如果能整除,那么将用10+n/m分钟到学校.如果不能,则将余下的时间再加1分钟,也就是11+n/m分钟.

这个分位是由8:00(7:60)-12分得到的,也就是7:48,所以ti就是代表有多少个60.

hour *= ti;
tj = hour - t;
if (8 - ti < 0) {
    tk = 8 - ti + 24;
}
else if (8 - ti >= 0)   {
    tk = 8 - ti;
}

 hour变量初始定义为60,60×ti-t(也就是前面的7:60,还可以6:120),这个分位就以新的hour值减去t得到的tj.

现在考虑前一天的情况,他可能于前一天出发,所以ti要是减到了昨天,就将他重置加24小时代表tk的值,就是时位.如果ti没减到昨天,那么直接减.

if (tk < 10 && tj < 10)    {
        cout<<"0"<<tk<<":"<<"0"<<tj<<endl;
    }
    else if (tk >= 10 && tj < 10)  {
        cout<<tk<<":"<<"0"<<tj<<endl;
    }
    else if (tk < 10 && tj >= 10)	{
    	cout<<"0"<<tk<<":"<<tj<<endl;
	}
	else if (tk >= 10 && tj >= 10)	{
		cout<<tk<<":"<<tj<<endl;
	} 

最后是输出环节,如果tj或tk的值是一位数,则前面输出0,若没有,直接输出值.

AC代码

#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
using namespace std;
int main()  {
    int n,m,t,ti,tj,tk;
    int hour = 60;
    cin>>n>>m;
    if (n % m == 0) {
        t = n / m + 10;
    }
    else if (n % m != 0)    {
        t = n / m + 11;
    }
    if (t % 60 == 0)    {
        ti = t / 60;
    }
    else if (t % 60 != 0)   {
        ti = t / 60 + 1;
    }
    hour *= ti;
    tj = hour - t;
    if (8 - ti < 0) {
        tk = 8 - ti + 24;
    }
    else if (8 - ti >= 0)   {
        tk = 8 - ti;
    }
    if (tk < 10 && tj < 10)    {
        cout<<"0"<<tk<<":"<<"0"<<tj<<endl;
    }
    else if (tk >= 10 && tj < 10)  {
        cout<<tk<<":"<<"0"<<tj<<endl;
    }
    else if (tk < 10 && tj >= 10)	{
    	cout<<"0"<<tk<<":"<<tj<<endl;
	}
	else if (tk >= 10 && tj >= 10)	{
		cout<<tk<<":"<<tj<<endl;
	} 
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值