公布成绩(改)解析

题目描述
有 $n$ 个学生,第 $i$ 个学生希望在第 $t_i$ 天或之前得知课程的成绩。如果在第 $t_i$ 天之前成绩公布了,他就会非常开心,每提前一天就会产生 $B$ 点愉快度。但如果在第 $t_i$ 天成绩没有公布,他就会等待,每等待一天就会产生 $C$ 不愉快度。所以同学的愉快度总和,等于愉快度减去不愉快度,可以为负数。请你编写程序,根据输入的 $m$,计算当成绩在第 $1$ 天到第 $m$ 天公布时,所有学生的愉快度之和分别是多少。

输入格式
第一行三个正整数 $n,m,B,C$,分别表示学生的数量是 $n$,询问的天数是 $m$,每提前一天就会产生 $B$ 愉快度。,每等待一天就会产生 $C$ 不愉快度。 第二行 $n$ 个正整数,表示每个学生希望的公布成绩的时间。

输出格式
输出一行 $m$ 个空格隔开整数,第 $i$ 个整数表示当成绩在第 $i$ 天公布时,愉快度之和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <vector>
using namespace std;

int main() {
int n, m, B, C;
cin >> n >> m >> B >> C;
vector<int> t(n);
for (int i = 0; i < n; ++i) {
cin >> t[i];
}
vector<long long> results(m, 0); // 存储每一天的愉快度总和
for (int d = 1; d <= m; ++d) {
long long totalHappiness = 0;
for (int i = 0; i < n; ++i) {
if (d <= t[i]) {
// 提前公布,计算愉快度
totalHappiness += B * (t[i] - d);
} else {
// 延迟公布,计算不愉快度
totalHappiness -= C * (d - t[i]);
}
}
results[d - 1] = totalHappiness; // 记录第 d 天的总愉快度
}
// 输出结果
for (int i = 0; i < m; ++i) {
cout << results[i];
if (i < m - 1) {
cout << " ";
}
}
cout << endl;

return 0;
}

代码分析

  1. 输入处理
    首先读取四个整数 $n,m,B,C$,分别表示学生数量、询问天数、提前一天的愉快度和等待一天的惩罚。
    然后读取 $n$ 个整数,表示每个学生希望的公布成绩的时间。

  2. 初始化结果数组
    创建一个大小为 $m$ 的数组 results,用于存储每一天的愉快度总和,初始值为 0。

  3. 计算每一天的愉快度
    遍历每一天 $d$(从 1 到 $m$)。
    对于每一天,遍历所有学生,计算他们的愉快度或惩罚,并累加到 $totalHappiness$ 中。
    如果学生希望的公布成绩时间 $t_i$ 小于等于 $d$,则计算提前公布的愉快度 $B \times (t_i - d)$。
    否则,计算延迟公布的惩罚 $C \times (d - t[i])$。
    将计算得到的 $totalHappiness$ 存储到 results 数组中。

  4. 输出结果
    遍历 results 数组,输出每一天的愉快度总和。


公布成绩(改)解析
https://mr-onion-blog.github.io/2024/11/01/公布成绩(改)解析/
作者
Mr_Onion
发布于
2024年11月1日
许可协议