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\) 的大小关系来分类讨论。
-
如果 \(c\leqslant d\),则他每次设完闹钟之后,总会还没入眠就又被闹钟叫醒,因此他永远也不能睡够,答案为 \(-1\)。
-
如果 \(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;
}