小粉兔在 T 大学就读。在 1 月 54 日,T 大学开始了一学期一度的期末考试环节。

小粉兔本学期有 'n' 科考试,按照时间先后顺序依次被标号为 1, 2, ⋯, n。每一科考试都具有一个难度系数 'ai' 。

如果准备这么多考试,小粉兔很可能会压力激增。因此,他想要仅准备并参与一部分考试,而将剩余的科目申请缓考。具体的,他可以选择准备前任意科考试(可以是 0 门,可以是 'n' 门),而剩余的科目不做准备。

但是,缓考的考试在下学期仍然需要参加,所以小粉兔会对他的决策做一个评估。他会使用'压力值'去完成这一评估过程。

具体的,我们设小粉兔选择参加前 'k' 科考试(0≤k≤n)。给定一个压力系数 'c',此时他的压力值 't' 的计算方式如下:

't = maxi=1k ai +c×(n−k)'

其中 maxi=1k ai 代表 a1, a2, ⋯, ak 中的最大值。特别的,如果 k=0,则 maxi=1k ai =0。

现在,小粉兔知道了考试的科数 'n' 和每门考试的难度系数 a1, a2, ⋯, an ,请你帮他计算出'压力值'最小时需要准备的考试科目数量。

输入格式

输入共两行。

第一行为两个整数 'n, c',分别代表考试的科目数和压力系数。 第二行为 'n' 个整数 a1, a2, ⋯, an ,代表每门考试的难度系数。

输出格式

输出共一行两个整数,依次代表小粉兔'压力值'最小时需要准备的考试科目数量 'k' 和对应的最小'压力值'。如果有多个 'k' 对应的'压力值'相同且最小,请在相应位置输出其中最小的一个。

输入输出样例

输入 #1

3 2
2 3 5

输出 #1

2 5

输入 #2

10 3
6 4 5 5 6 2 2 4 19 9

输出 #2

8 12

输入 #3

3 2
7 2 5

输出 #3

0 6

C++ 代码实现

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

int main() {
    int n, c;
    cin >> n >> c;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    
    int k = 0;
    int minPressure = INT_MAX;
    for (int i = 0; i <= n; i++) {
        int maxDifficulty = 0;
        for (int j = 0; j < i; j++) {
            maxDifficulty = max(maxDifficulty, a[j]);
        }
        int pressure = maxDifficulty + c * (n - i);
        if (pressure < minPressure) {
            minPressure = pressure;
            k = i;
        }
    }
    
    cout << k << ' ' << minPressure << endl;
    
    return 0;
}

算法思路

首先读入考试的科目数 n 和压力系数 c,以及每门考试的难度系数 a1, a2, ..., an。

然后,遍历所有可能的准备科目数量 k,从 0 到 n。

对于每一个 k,计算准备前 k 门考试的最大难度系数 maxDifficulty,以及对应的压力值 pressure。

如果当前的压力值 pressure 小于之前的最小压力值 minPressure,更新 minPressure 和对应的准备科目数量 k。

最后输出准备科目数量 k 和最小压力值 minPressure。

小粉兔的期末考试压力值最小化 - 算法与代码实现

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

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