codeforces 1354A 菜鸟题解
程序员文章站
2022-05-04 16:25:23
...
codeforces 1354A 菜鸟题解
题目链接:https://codeforc.es/problemset/problem/1354/A
题目解释:
输入为a b c d
- 总共要睡a分钟;
- 每次休息时间为b分钟;
- 闹铃每次设置后c分钟响;
- 每次被闹铃吵醒需要d分钟睡着;
说人话:
- 在下次闹铃响之前,我能睡c - d分钟;
- 在第一闹铃响之前,我能睡b分钟。
最后求需要的总时间!!!
题目分析:
1、a < b
如果说a < b,那么说明第一次我还没睡醒呢,睡得时间已经够了,那么总睡眠时间b分钟,直接不用往下做了;
2、a > b && c > d
如果说a > b,并且距离下次闹铃响需要5分钟,然鹅,我睡着需要10分钟,那么我就永远不可能睡够a分钟;
以上两种情况是不用计算的,直接输出结果就好了,第一种输出b,第二种输出-1。
如果不满足以上条件,那就可以先算出闹铃响几次才能睡够,然后响的次数乘以闹铃时间,再加上最开始的b分钟,就是结果,正解!开搞。
所以说,根据以上信息就能够算出来,总共闹铃要响几次,cnt = (a - b) / (c - d),但是这里有可能会是小数,这时候需要向上取整,但是不能强转double,然后用ceil函数,因为范围太大,要用的是long long,所以这个时候判断一下(a - b) % (c - d) == 0,如果成立,那么说明是刚刚好,如果不成立,那么还要加1(手动向上取整~)。
所有信息搞出来了,然后就是代码了
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
ios::sync_with_stdio(false);
cin >> t;
while (t--){
ll a, b, c, d;
cin >> a >> b >> c >> d;
if (b < a && c <= d){
cout << -1 << endl;
continue;
}
if (b >= a){
cout << b << endl;
continue;
}
ll ret = 0;
if ((a - b) % (c - d) == 0)
ret = (a - b) / (c - d);
else
ret = (a - b) / (c - d) + 1;
ret = b + ret * c;
cout << ret << endl;
}
return 0;
}
个人习惯,喜欢用cin 和cout,看个人习惯。
对了对了,之前有人说向上取整用 (a - 1) / b + 1 更准确,暂时还没试,我先记下来
有志者,事竟成,破釜沉舟,百二秦关终属楚。
苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
上一篇: codeforces—1146B. Hate "A"——题解
下一篇: Java多线程详解
推荐阅读
-
Codeforces Global Round 9(A~D题解)
-
CodeForces April Fools Contest 2018题解
-
【Codeforces Global Round 7】A. Bad Ugly Numbers 题解
-
CodeForces 938E Max History 题解
-
Codeforces Round #659 (Div. 2) 题解
-
Codeforces 16D Logging 题解
-
Codeforces Round #654 (Div. 2) - 题解
-
Educational Codeforces Round 98 (Rated for Div. 2) A-E 题解
-
Codeforces Round #670 (Div. 2) (A~E题解)
-
Codeforces Round #491 (Div. 2)部分题解