1 solutions
-
0
题目大意
塔子哥是一名监考机器人,能够同时监控多个考场。每个考场有不同的考试开始时间和结束时间。监控一个考场的费用是每分钟 3金币;监控两个或以上的考场时,费用是每分钟 4金币;如果没有监控任务,则每分钟消耗 1金币。要求计算塔子哥在一天的监考任务中能够获得多少金币。
思路
知识点学习:Oi-Wiki 前缀和&差分
题目意思本质为:一维正半轴上给条线段。每个整点有一个值,大小根据点覆盖的线段个数 来定.
然后求从最左边线段开始,到最右边线段结束这个区间的 之和。
暴力做法
由于区间的范围有限,可以开数组。所以一个显然的暴力做法是:
1.枚举所有线段,循环让其覆盖的点 .
2.最后扫一遍 数组,根据上述条件得到 再求和即可。复杂度爆炸
优化
<暴力做法>中的第一步可以用差分数组解决:对于区间 , 我们 。 然后所有区间处理完之后,对 做前缀和 即可。 (可以自己纸上模拟这个过程体会一下原理)
代码说明
1.输入处理:
读取考场的数量 n,并记录每个考场的开始时间和结束时间。
2.初始化边界:
找到所有考场的最早开始时间和最晚结束时间,以便确定时间范围。
3.构建差分数组:
使用差分数组来表示每个时间点被监控的考场数量。 对于每个考场的时间段 [a_i, b_i],在 cover[a_i] 增加 1,cover[b_i + 1] 减少 1。
4.前缀和计算:
对差分数组进行前缀和计算,得到每个时间点的覆盖数量 cover[i]。
5.计算金币收入:
根据覆盖的数量计算在时间段内的收入。 如果 cover[i] == 0,收入增加 1;如果 cover[i] == 1,收入增加 3;如果 cover[i] > 1,收入增加 4。
6.输出结果:
输出塔子哥在监考过程中的总收入。
差分数组
代码(C++/Java/Python/Go/Js)
CPP
python
Java
Go
Js
- 1
Information
- ID
- 8
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 110
- Accepted
- 20
- Uploaded By