CF1354A Alarm Clock 题解

Content

小 \(P\) 要睡足 \(a\) 分钟,他为自己设定了一个 \(b\) 分钟后的闹钟。如果在 \(b\) 分钟后闹钟响时他还是没有睡够,他会在设定一个 \(c\) 分钟的闹钟,并花费 \(d\) 分钟入眠,如果在闹钟响后他还是没有睡够,他将重复设定闹钟并花费一定时间入眠,直到他在一次闹钟响后睡够了为止。现在给定 \(t\) 组 \(a,b,c,d\),请问小 \(P\) 需要花费多少分钟才能让自己睡够?如果无论怎样都不能让他睡够,输出 \(-1\)。

数据范围:\(1\leqslant t\leqslant 1000,1\leqslant a,b,c,d\leqslant10^9\)。

Solution

模拟题目。同时也是分类讨论的一道好题。

我们先根据 \(a,b\) 的大小关系来分类讨论:

一、如果 \(a\leqslant b\),那么只需要一次闹钟小 \(P\) 就会醒来,那么所花费的时间就是 \(b\)。

二、如果 \(a>b\),我们再根据 \(c,d\) 的大小关系来分类讨论。

  1. 如果 \(c\leqslant d\),则他每次设完闹钟之后,总会还没入眠就又被闹钟叫醒,因此他永远也不能睡够,答案为 \(-1\)。

  2. 如果 \(c>d\),则他每次设完闹钟之后,会睡 \((c-d)\) 分钟。又因为他被第一个闹钟叫醒之后还需要睡 \((a-b)\) 分钟,因此需要叫醒他 \(\left\lceil\dfrac{a-b}{c-d}\right\rceil\) 次他才能够睡够,而每次花费的时间显然是 \(c\) 分钟,所以总共所需要花费的时间就是 \(\left\lceil\dfrac{a-b}{c-d}\right\rceil\times c+b\)。

下面的代码使用了一个 \(\texttt{judge}\) 函数返回了题目的答案,思路如上,因此这里只给出 \(\texttt{judge}\) 函数,剩下的留给读者思考(难度几乎是没有的,毕竟 \(\texttt{judge}\) 函数才是这个代码的核心)。

Code

long long judge(long long a, long long b, long long c, long long d) {
	if(a <= b)	return b;
	if(a > b && c <= d)	return -1;
	if(a > b && c > d)		return (long long)(ceil((a - b) * 1.0 / (c - d))) * c + b;
}
上一篇:查询多表的信息,放到一个表中(使用触发器)


下一篇:剑指 Offer 26. 树的子结构(java & python)