Educational Codeforces Round 87 (Rated for Div. 2) A. Alarm Clock

发布时间 2023-10-16 04:19:37作者: zsxuan

你总共需要睡满 \(a\) 分钟,第一个闹钟将会在第 \(b\) 分钟的时候响起。如果你醒来的时候睡眠不足,你会将脑子往后调 \(c\) 分钟,然后你需要 \(d\) 分钟的时间进入睡眠。假设第 \(0\) 分钟时你刚进入睡眠状态。

询问你最快能的起床时间,或者说明这是不可能的。

  • \(a \leq b\) ,你会在第 \(b\) 分钟起床。否则需要往后调若干次闹钟。
  • 若调闹钟的次数 \(t > 0\)\(b + td \geq a + tc\) 需要成立。
    • \(d \leq c\) ,你永远不想起床。
    • 否则 \(t \geq \frac{a - b}{d - c}\) ,即 \(t = \lceil \frac{a - b}{d - c} \rceil\) 。你将会在 \(b + t \cdot d\) 分钟后起床。
view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	ll a, b, c, d; std::cin >> a >> b >> c >> d;
	// b + t * c >= a + t * d
	// t >= (a - b) / (c - d)
	if (a <= b) std::cout << b << '\n';
	else {
		if (d >= c) std::cout << -1 << '\n';
		else std::cout << b + (a - b + c - d - 1) / (c - d) * c << '\n';
	}
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}