华为OD机试C++ - Wonderland

300 篇文章 49 订阅 ¥59.90 ¥99.00

Wonderland

前言:本专栏将持续更新互联网大厂机试真题,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于大厂机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.com;备注:CSDN。


题目描述

Wonderland是小王居住地一家很受欢迎的游乐园。Wonderland目前有4种售票方式,分别为一日票(1天)、三日票(3天)、周票(7天)和月票(30天)。每种售票方式的价格由一个数组给出,每种票据在票面时限内可以无限制地进行游玩。例如:

小王在第10日买了一张三日票,小王可以在第10日、第11日和第12日进行无限制地游玩。

小王计划在接下来一年多次游玩该游乐园。小王计划地游玩日期将由一个数组给出。现在,请您根据给出地售票价格数组和小王计划游玩日期数组,返回游玩计划所需要地最低消费。

输入描述

输入为2个数组:

  • 售票价格数组为costs,costs.length = 4,默认顺序为一日票、三日票、周票和月票。
  • 小王计划游玩日期数组为days,1 ≤ days.length ≤ 365,1 ≤ days[i] ≤ 365,默认顺序为升序。

输出描述

完成游玩计划的最低消费。

样例1

input
5 14 30 100
1 3 5 20 21 200 202 230
output
40

代码:c++

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

int mincostTickets(vector<int>& days, vector<int>& costs) {
    vector<int> dp(days.back() + 1, 0);
    set<int> daySet(days.begin(), days.end());
    
    for (int i = 1; i < dp.size(); ++i) {
        if (daySet.find(i) == daySet.end()) {
            dp[i] = dp[i-1];
        } else {
            dp[i] = min({dp[max(0, i-1)] + costs[0], dp[max(0, i-3)] + costs[1], dp[max(0, i-7)] + costs[2], dp[max(0, i-30)] + costs[3]});
        }
    }
    return dp.back();
}

int main() {
    vector<int> costs(4);
    vector<int> days;
    for (int& cost : costs) cin >> cost;
    int day;
    while (cin >> day) days.push_back(day);

    cout << mincostTickets(days, costs) << endl;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值