Codeforces1512F Education(模拟)

题目链接: Education

大致题意

给定n和m, 表示有n个岗位和你需要凑够m元钱.

再给定两个序列a和b, 序列a的长度为n, b的长度为n-1. a[i]表示处于第i个岗位时, 每天可以挣多少钱, b[i]表示升级到第i+1个岗位需要花费多少钱.

特别的, 当你选择升级到第i+1个岗位时, 这一天只会花费b[i]元, 并不会挣钱.

问: 至少需要多少天可以攒够m元钱.

解题思路

这个题我们只需要按照题目去模拟即可. 最终答案一定是升到某个岗位后, 停止再升, 直到赚到m元钱是最优的. 因此我们只需要分别枚举升级到每一个岗位, 需要多少天达成目标即可.

AC代码

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 2E5 + 10;
int a[N], b[N];
ll fact(ll a, ll b) { return (a + b - 1) / b; } //ceil函数, 库函数可能会出锅.
int main()
{
    int t; cin >> t;
    while (t--) {
        int n, m; scanf("%d %d", &n, &m);
        rep(i, n) scanf("%d", &a[i]);
        rep(i, n - 1) scanf("%d", &b[i]);
        
        ll res = LLONG_MAX; //当前最优解
        ll leave = 0, day = 0; //我们现在有的钱数, 和当前处于第几天
        rep(i, n) {
            ll need = fact(m - leave, a[i]); //提升到第i个岗位后还需要再工作的天数
            
            res = min(res, day + need); 
            
            ll impcost = fact(b[i] - leave, a[i]); //我们提升到下一个岗位要的天数
            leave = 1ll * impcost * a[i] + leave - b[i]; //此时我们还会剩多少钱
            day += impcost + 1; //我们此时又度过的天数, +1是因为提升岗位也需要额外花费一天.
        }
        
        printf("%d\n", res);
    }
    return 0;
}

END

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值