贪心问题

描述

假设你所在的公司有 n 个职位,编号从 1n,编号越高对应的报酬越高,假设你是个新人,目前还在职位 1,每一天你都可以选择在目前的职位上打工获得对映报酬,或是花费一定量的钱接受下一个职位的培训,培训只需一天,第二天即可升职,但是不可以跨职位培训。给出 n 个职位每天报酬 A \{ a_1,a_2,...,a_n\} 和 培训费用 B \{ b_1,b_2,...,b_{n-1}\}b_i 表示从 a_ia_{i+1}的培训费用。现在你想通过工作买一台价值 c 的计算机,求最少的工作天数。

分析

这一题是典型的贪心问题,是我的薄弱项,今天也是挣扎了10几分钟没有好的思路就看题解了。说一下题解的思路,我们最终肯定是要依靠一个职位来攒钱,所以可以分为 n 种情况,而一旦确定了最终的职位,那么所需要攒的钱就是固定的(培训费用加上计算机费用)。又因为职位报酬数组是递增的,所以越早升职攒钱越快,前面的钱全部充当培训费用一定是最优的。分别计算 n 个职位下所需工作天数,选取其中最小的即可。

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main() {
    int t; cin >> t;
    int n, c;
    while(t--) {
        cin >> n >> c;
        int a[n], b[n-1];
        for(int& x: a) cin >> x;
        for(int& x: b) cin >> x;

        ll ans = (c+a[0]-1) / a[0]; // pos0
        ll cur = 0, bal = 0;
        for(int i = 1; i < n; i++) {  // pos1 ~ pos(n-1)
            ll workDays = b[i-1] > bal ? (b[i-1] - bal + a[i-1] - 1) / a[i-1] : 0ll;
            cur += (workDays + 1);  // 还有一天用于升职

            if(cur > ans) break;
            bal += (a[i-1] * workDays - b[i-1]);

            ll workDays2 = c > bal ? (c- bal + a[i] - 1) / a[i] : 0ll;
            ans = min(ans, cur+workDays2);
        }

        cout << ans << '\n';
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.POJ 2376 DescriptionFarmer John is assigning some of hi...
    恰似一碗咸鱼粥阅读 1,882评论 0 0
  • 题目:给定一堆会议的起始时间和结束时间,求最多能够参加的会议数目。思路:贪心策略有三种:选最早开始的会议(会议可能...
    乘瓠散人阅读 3,287评论 0 0
  • 贪心一般就是按照某种贪心规则排序好之后从最贪心的方式开始选择,某种贪心规则一般用sort一起使用,以下是喝饮料的例子:
    CristianoC阅读 906评论 0 0
  • HR必知的九大效益计量公式 1人事费用率人事费用率指人力成本占销售额比重。该指标反应了人力成本的投入产出比,计算的...
    涛声依旧在在阅读 11,747评论 0 5
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 13,597评论 0 11

友情链接更多精彩内容