题解 B4082

· · 题解

[语言月赛 202412] 古希腊掌管罚时的神 题解

Source & Knowledge

本题来源于 2024 年 12 月的语言月赛,主要考察一维循环和累加操作的应用。

文字题解

题目大意

给定一系列有效提交记录,每条记录包含提交时间和是否通过的信息。需要计算一支队伍在比赛中的总罚时,罚时的计算方式是每道题目的第一次通过时间加上二十倍的未通过次数。

解析

注意到对于第 i 个题目,假设它在第 t_i 分钟通过,在这之前本题有 x_i 次未通过提交,则本题贡献的罚时

\mathrm{punishment}(i)=t_i + 20x_i

则总罚时

\begin{aligned} \mathrm{Punishment}&=\mathrm{punishment}(1)+\mathrm{punishment}(2)+\dots +\mathrm{punishment}(k)\\ &=t_1+20x_1 + t2+20x_2 + \dots t_k + 20x_k\\ &=(t_1+t_2+\dots t_k)+20(x_1 + x_2 + \dots x_k) \end{aligned}

即总罚时等于所有通过记录的时间之和加上 20 倍的所有题目未通过次数。可以依据这个式子,来计算答案。

当读入到一条通过记录时,就给总时间加上该记录的时间,否则这条记录只会贡献 20 分钟罚时。

读入

首先读取有效提交记录的条数 n

int n;
cin >> n;

计算罚时

依据说明完成即可。

long long ans = 0;
for (int i = 0; i < n; ++i) {
    int a, b;
    cin >> a >> b;
    if (b) {
        ans += a; // 通过记录,加上通过时间
    } else {
        ans += 20; // 未通过记录,加上 20
    }
}

输出

最后,输出计算出的总罚时。

cout << ans << endl;

通过上述步骤,我们可以有效地计算出队伍在比赛中的总罚时。