华为od 贪心歌手 C++代码实现

贪心歌手

题目详情 - 贪心歌手 - Hydro

题目描述

一个歌手准备从A城去B城参加演出。

  1. 按照合同,他必须在 T 天内赶到

  2. 歌手途经 N 座城市

  3. 歌手不能往回走

  4. 每两座城市之间需要的天数都可以提前获知。

  5. 歌手在每座城市都可以在路边卖唱赚钱。

    经过调研,歌手提前获知了每座城市卖唱的收入预期: 如果在一座城市第一天卖唱可以赚M,后续每天的收入会减少D(第二天赚的钱是 M - D,第三天是 M - 2D …)。如果收入减少到 0 就不会再少了。

  6. 歌手到达后的第二天才能开始卖唱。如果今天卖过唱,第二天才能出发。

贪心的歌手最多可以赚多少钱?

输入描述

第一行两个数字 T 和 N,中间用空格隔开。

  • T 代表总天数,0 < T < 1000
  • N 代表路上经过 N 座城市,0 < N < 100

第二行 N+1 个数字,中间用空格隔开。代表每两座城市之间耗费的时间。

  • 其总和 ≤ T。

接下来 N 行,每行两个数字 M 和 D,中间用空格隔开。代表每个城市的输入预期。

  • 0 < M < 1000
  • 0 < D < 100

输出描述

一个数字。代表歌手最多可以赚多少钱。以回车结束。

用例1

输入

10 2
1 1 2
120 20
90 10

输出

540

说明

总共10天,路上经过2座城市。

路上共花 1+1+2=4 天

剩余6天最好的计划是在第一座城市待3天,在第二座城市待3天。

在第一座城市赚的钱:120 + 100 + 80 = 300

在第二座城市赚的钱:90 + 80 + 70 = 240

一共 300 + 240 = 540。

C++代码实现

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <numeric>
using namespace std;


//计算最大收益
int maxProfit(int timeday, vector<int>& incomes) {
    int sum = 0;

    // 对收益数组进行排序
    sort(incomes.begin(), incomes.end(), greater<int>());

    // 取前 timeday 个最大值求和
    for (int i = 0; i < timeday && i < incomes.size(); ++i) {
        sum += incomes[i];
    }

    return sum;
}

// 计算每天可能的收益
vector<int> countDailyIncome(vector<int>& dailyIncome, int money, int decrease) {
    while (money > 0) {
        dailyIncome.push_back(money);
        cout << "may be earn " << money << endl;
        money -= decrease;
        if (money < 0) {
            money = 0;
        }
    }
    return dailyIncome;
}

int main() 
{
    int T, N;
    cin >> T >> N;

    int times = 0; // 初始化 times 为 0
    vector<int> time(N + 1);
    for (int i = 0; i <= N; ++i) {
        cin >> time[i];
        times += time[i]; // 累加每座城市耗费的时间
    }
    int mc_days = T - times;        //卖唱天数

    vector<int> mayincome;
    vector<pair<int, int>> incomes(N);
    for (int i = 0; i < N; ++i) {
        cin >> incomes[i].first >> incomes[i].second;
        countDailyIncome(mayincome, incomes[i].first, incomes[i].second);
    }

    

    int max_profit = maxProfit(mc_days, mayincome);
    cout << max_profit << endl;

    return 0;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD是华为公司推出的一款智能办公平台,用户可以在OD上完成诸如文档编辑、表格处理、代码编写等办公任务。在OD平台中,C语言的代码编辑器实现了C语言代码的编辑、调试及运行功能。 首先,华为OD的C代码编辑器提供了一个用户友好的界面,用户可以轻松创建、打开和编辑C语言代码文件。用户可以通过该编辑器输入C语言代码,进行代码的修改和补充。 其次,华为OD的C代码编辑器提供了一系列的代码补全和自动格式化的功能,能够帮助用户提高代码的编写效率和准确性。编写C语言代码时,如果用户输入一部分代码,编辑器会自动提示可能的代码补全选项,避免用户频繁输入相似的代码片段。此外,编辑器还支持自动格式化功能,使得代码的排版整齐统一,提高代码的可读性。 此外,华为OD的C代码编辑器还提供了调试功能,用户可以在编辑器中设置断点,逐行调试C语言代码。用户可以通过调试功能逐步执行代码,观察变量的值变化,找出代码中的错误和问题,进一步提高代码的质量和准确性。 最后,华为OD的C代码编辑器还支持C代码的运行和输出。用户可以直接在编辑器中运行代码,查看代码的输出结果。用户可以通过这个功能验证代码的正确性或者调试程序。 综上所述,华为OD的C代码编辑器实现了C语言代码的编辑、调试和运行等功能,能够帮助用户更高效、准确地编写C语言代码,提高代码的质量和可读性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值