0%

CF292A 题解

一、题意分析

简单阅读一边题目,看一眼数据范围,发现 $n \le 1000$。显然,最多 $1000$ 条申请直接模拟即可。

二、思路

没什么好说的,忠实地模拟每一条申请即可。

一定要注意操作的逻辑、时间顺序以及最大值的记录时间

三、AC code

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n = eval(input())
cnt = 0 # 消息队列中的消息个数
lt = 0 # 上一条申请的时间
mn = 0 # 队列最长的长度
for i in range(n):
t, c = input().split()
t, c = int(t), int(c)
cnt -= t - lt # 先扣除两次申请之间发送掉的消息
lt = t # 记录本次申请的时间
if cnt < 0: # 如果减过头就再加回来
cnt = 0
cnt += c # 加上本次申请加入的消息
if cnt > mn: # 如果有更大的 n 就记录下来
mn = cnt
print(cnt + t, mn) # 最后一条消息发送出去的时间即为最后申请的时间加还剩的消息数

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <bits/stdc++.h>

using namespace std;

int n, cnt, lt, mn, t, c; // 与 Python 代码中的变量含义相同,不再赘述

int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> t >> c;
cnt -= t - lt; // 先扣除两次申请之间发送掉的消息
lt = t; // 记录本次申请的时间
if (cnt < 0) cnt = 0; // 如果减过头就再加回来
cnt += c; // 加上本次申请加入的消息
if (cnt > mn) mn = cnt; // 如果有更大的 n 就记录下来
}
cout << cnt + t << " " << mn; // 最后一条消息发送出去的时间即为最后申请的时间加还剩的消息数
}