codeforces 1354A 菜鸟题解

2 篇文章 0 订阅

codeforces 1354A 菜鸟题解

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

在这里插入图片描述

题目解释:

输入为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 更准确,暂时还没试,我先记下来

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值