首先,我们可以观察到,每天最后一位顾客买奶茶不用付钱,免费送,这意味着每天最后一组的顾客不会为奶茶支付费用。因此,我们可以将每天的顾客分为两类:最后一组的顾客和其他组的顾客。

对于最后一组的顾客,我们可以直接计算他们的收益。根据题目描述,每位顾客只会买一杯奶茶(不包括送的幸运茶),纯收益是 $k$ 元。因此,最后一组的顾客的收益是 $k$ 乘以最后一组的顾客数。

对于其他组的顾客,我们需要考虑幸运茶的分配。我们可以使用动态规划来解决这个问题。定义一个二维数组 $dp[i][j]$ 表示前 $i$ 天的顾客分配情况下,第 $i$ 组顾客为第 $j$ 个顾客时的最大收益。则状态转移方程如下:

$$\dp[i][j] = \max(dp[i-1][j-1]+\text{喜爱度}_j, dp[i-1][j])$$

其中,$\text{喜爱度}_j$ 表示第 $j$ 个顾客的喜爱度。注意,当第 $j$ 个顾客不喜欢幸运茶时,$\text{喜爱度}_j$ 应为 $0$。

最终的答案就是 $dp[n][m]$,表示前 $n$ 天的最大收益。

具体的实现可以参考下面的代码:

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

int main() {
    int n, m, p, k, r;
    cin >> n >> m >> p >> k >> r;
    vector<int> like(m);
    vector<int> tea(n);
    for (int i = 0; i < m; i++) {
        cin >> like[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> tea[i];
    }

    // 计算最后一组顾客的收益
    int lastGroup = 0;
    for (int i = 0; i < n; i++) {
        lastGroup += tea[i];
    }
    int profit = lastGroup * k;

    // 动态规划求解其他组顾客的收益
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            dp[i][j] = max(dp[i-1][j-1] + (like[j-1] == 3 ? 3 : 0), dp[i-1][j]);
        }
    }
    profit += dp[n][m] * p;

    // 输出结果
    cout << profit - r * (n - lastGroup) << endl;

    return 0;
}

该算法的时间复杂度为 $O(n \cdot m)$,可以在给定的数据范围内快速求解问题。


原文地址: https://www.cveoy.top/t/topic/qzq6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录