大家好,我是小C,一个每天嘻嘻哈哈的斜杠女青年🙋。我是一个爱自媒体,爱创作🔍的少儿编程从业者🖥️
今天,给大家讲解一道题针对于编程初学者的竞赛真题 — Jogging,该题目来源于AtCoder平台的ABC编程竞赛,既然讲到AtCoder平台,那就简单介绍一下:
AtCoder Beginner Contest(ABC)是AtCoder平台上的一个专门为初学者设计的编程竞赛。
其中,AtCoder Beginner Contest(ABC)是AtCoder平台上的一个系列竞赛,旨在帮助初学者提高他们的编程能力。该竞赛分为四个难度级别:A、B、C和D,其中A级问题通常是最简单的,而D级问题则更加复杂。
另外,AtCoder是日本最大的算法竞技网站,也是全球第二流行的算法竞技网站。它提供编程在线比赛、过往比赛提交、在线评测等服务。ABC竞赛因其适合初学者的特点,吸引了大量编程爱好者参与,成为提高编程技能的重要平台。
今天,我们来讲解一道题 — Jogging(慢跑),这是一道简单的数学题,但是我们可以使用自定义函数来解决这个问题,旨在培养学生模块化编程思想和代码复用能力。
题目描述:小高和小李决定去慢跑。
小高重复以下动作:"以每秒B米的速度行走A秒,然后休息C秒"。
小李重复以下动作:"以每秒E米的速度行走D秒,然后休息F秒"。
当他们同时开始慢跑后X秒时,小高和小李谁走得更远?输入格式:输入从标准输入中,以下列格式给出
A B C D E F X输出格式:当他们同时开始慢跑后X秒时,如果小高走得更远,输出Takahashi,如果小李走得更远,输出Aoki,如果他们走的距离相同,输出Draw。
【数据范围】
1≤A,B,C,D,E,F,X≤1001≤A,B,C,D,E,F,X≤100
所有输入值均为整数
以下给出三组数据测试样例,大家自行测试
输入样例1:4 3 3 6 2 5 10
输出样例1:Takahashi
样例解释:小高以每秒3米的速度行走4秒,然后休息3秒。小李以每秒2米的速度行走6秒,然后休息5秒。问开始慢跑10秒后,小高和小李谁走得更远? — 小高走得远!
先计算小高10秒后走了多少米?
答:小高走了4秒,休息了3秒,那么每经过这样一个(行走+休息)的过程需要4+3=7秒。当时间过去10s,在这个10秒里面,共包含了10/(4+3)=1个这样的过程。1个这样的过程里面包含4秒的行走时间,而小高1秒可以走3米,那么4秒共可以走4*3=12米,当经历完这样的一个过程之后,剩下10%(4+3)=3秒,又要重复同样的过程(行走+休息),注意,此时只剩下3秒,而小高要行走4秒,要以实际的时间为准,因此剩下的3秒都在行走,1秒行走3米,3秒共行走3*3=9米,因此小高总共的行走距离为12+9=21米。
再计算小李10秒后走了多少米?
答:小李走了6秒,休息了5秒,那么每经过这样一个(行走+休息)的过程需要6+5=11秒。当时间过去10s,在这个10秒里面,共包含了10/(6+5)=0个这样的过程,那么这个时候就说明一个(行走+休息)的过程加起来的总时间都没有达到给出的指定时间X秒,那么此时需要按照实际的行走时间计算,即行走了6秒,每秒走了2米,那么共走了2*6=12米。
因为21米>12米,因此小高行走的距离更远,输出Takahashi。
输入样例2:3 1 4 1 5 9 2
输出样例2:Aoki
样例解释:小高以每秒1米的速度行走3秒,然后休息4秒。小李以每秒5米的速度行走1秒,然后休息9秒。问开始慢跑2秒后,小高和小李谁走得更远? — 小李走得远!
先计算小高2秒后走了多少米?
答:小高走了3秒,休息了4秒,经过这样的一个过程(行走+休息)之后需要3+4=7秒。当时间过去2秒,2秒达不到这样的一个完整过程(3+4=7秒),又因为小高需要行走3秒,因此按照2秒来计算行走的距离,小高共行走2*1=2米。
再计算小李2秒后走了多少米?
答:小李走了1秒,休息了9秒,经过这样的一个过程(行走+休息)之后需要1+9=10秒。当时间过去2秒,2秒达不到这样的一个完整过程(1+9=10秒),又因为小李行走时间是1秒,因此按照1秒时间来计算,小李共行走1*5=5米。
因为2米<5米,因此小李的行走距离更远,输出Aoki。
输入样例3:1 1 1 1 1 1 1
输出样例3:Draw
样例解释:小高以每秒1米的速度行走1秒,然后休息1秒。小李以每秒1米的速度行走1秒,然后休息1秒。问开始慢跑1秒后,小高和小李谁走得更远? — 小李走得远!
嘻嘻,这个就很简单啦,既然小高和小李行走速度一样,而且行走的时间和休息的时间也一样,那么不管经过了多少秒,他们两个人行走的距离也是一致的,因此输出Draw。
解题思路:
其实这道题可以这样来考虑,即:在X秒的时间里有几个(行走+休息)的过程,假设行走A秒,休息C秒,那么就含有X/(A+C)个这样的过程,而每个过程都包含了一个行走时间A秒,那么这么多个过程行走时间就是X/(A+C)*A,而又因为每秒的速度是B米,因此行走的距离为X/(A+C)*A*B米。注意,这个时候还没完,因为X/(A+C)可能会产生余数,这个余数有可能比行走时间A秒小,也有可能比行走时间A秒大,我们只需要取最小的那个时间乘上速度即可得到行走的距离,再加上之前算出来的距离,现在计算的结果才是行走的总距离。
举一个具体的例子(剩余的时间大于行走时间):比如X=10,A=4,C=3,B=3,那么就包含10/(4+3)=1个这样的过程,1个这样的过程里面有1个行走时间A=4秒,因此行走时间为4秒,行走距离为4*3=12米,又因为X%(A+C)= 10 % (4+3) = 3秒,行走时间是4秒,因此实际上走了3*3=9米,注意,此时剩余的时间是小于行走时间的,因此要以剩余时间为准,总的行走距离为12+9=21米。
再举一个例子(剩余时间小于行走时间):比如X=10,A=2,C=4,B=3,那么就包含10/(2+4)=1个这样的过程,1个这样的过程里面含有1个行走时间A=2秒,因此行走时间为2秒,行走距离为2*3=6米,又因为X%(A+C)=10%(2+4)=4秒,行走时间是2秒,因此实际上走了2*3=6米,注意,此时剩余时间是大于行走时间的,因此要以实际行走时间为准,总的行走距离为6+6=12米。
参考代码:
// ABC249 A - Jogging
/*
Takahashi和Aoki决定慢跑。Takahashi重复以下动作:“以每秒B米的速度行走A秒,然后休息C秒。”
Aoki重复以下动作:“以每秒E米的速度行走D秒,然后休息F秒。”当他们同时开始慢跑X秒后,谁领先?
*/
#include <bits/stdc++.h>
using namespace std;
// 以每秒B米的速度行走A秒,然后休息C秒, x秒后在哪里
int dist(int x, int a, int b, int c) {
return x / (a + c) * (a * b) + min(x % (a + c), a) * b;
}
int main() {
int A, B, C, D, E, F, X;
cin >> A >> B >> C >> D >> E >> F >> X;
int xg = dist(X, A, B, C);
int xl = dist(X, D, E, F);
if (xg > xl) cout << "Takahashi" << endl;
else if (xg < xl) cout << "Aoki" << endl;
else cout << "Draw" << endl;
return 0;
}