欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

codeforces 1354A 菜鸟题解

程序员文章站 2022-05-04 16:25:23
...

codeforces 1354A 菜鸟题解

题目链接:https://codeforc.es/problemset/problem/1354/A

codeforces 1354A 菜鸟题解

题目解释:

输入为a b c d

  1. 总共要睡a分钟;
  2. 每次休息时间为b分钟;
  3. 闹铃每次设置后c分钟响;
  4. 每次被闹铃吵醒需要d分钟睡着;

说人话:

  1. 在下次闹铃响之前,我能睡c - d分钟;
  2. 在第一闹铃响之前,我能睡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 更准确,暂时还没试,我先记下来

有志者,事竟成,破釜沉舟,百二秦关终属楚。
苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

相关标签: cf 算法 c++