[10月考试] D
[10月考试] D
题目描述
有一个文件正在被下载,当前是第 nnn 分钟。
给定每分钟文件下载的百分比 aia_iai(输入中省去 %
),按照每 5%5\%5% 输出一格并向下取整的方式,输出每分钟下载的进度条,第 iii 行代表第 iii 分钟,输出格式见样例。
对于所有数据,1≤n≤201\leq n\leq 201≤n≤20,0≤ai≤1000\leq a_i\leq 1000≤ai≤100,保证 aia_iai 单调不降。
输入格式
输入共 222 行。
第 111 行输入 111 个正整数 nnn。
第 222 行输入 nnn 个正整数 a1,a2,…,ana_1,a_2,\ldots ,a_na1,a2,…,an。
输出格式
输出共 nnn 行,每行输出一个字符串代表下载进度。
样例 #1
样例输入 #1
5
0 12 48 70 99
样例输出 #1
|
-- |
--------- |
-------------- |
------------------- |
样例 #2
样例输入 #2
2
1 100
样例输出 #2
|
--------------------|
提示
对于 20%20\%20% 的数据,n=1n=1n=1。
对于 50%50\%50% 的数据,n≤5n\leq 5n≤5。
对于所有数据,1≤n≤201\leq n\leq 201≤n≤20,0≤ai≤1000\leq a_i\leq 1000≤ai≤100,保证 aia_iai 单调不降。
这道题目要求我们模拟文件下载进度条的输出,给定每分钟的下载进度百分比 a_i
,并按照每 5% 为一格,向下取整的方式输出进度条。每行输出一个进度条的状态。
解题思路
-
进度条的表示:
- 每 5% 显示一格。也就是说,进度
0%
对应进度条的起点|
,5%
对应|----
,100%
对应满格的|--------------------|
(20格,最大)。
- 每 5% 显示一格。也就是说,进度
-
如何映射百分比到进度条:
-
对于每个给定的百分比
a_i
,我们需要计算该百分比所对应的格数。具体来说,计算公式是:格数=ai/5
这表示将
a_i
除以 5,取整后得到的格数。例如:12%
对应 2 格:12 // 5 = 2
48%
对应 9 格:48 // 5 = 9
-
-
输出格式:
- 每行进度条的起点是
|
。 - 根据格数,使用
-
来表示下载进度。 - 进度条的长度固定为 20 格,因此,剩下的格子用空格填充。
- 每行进度条的起点是
具体步骤
- 读取输入:首先读取
n
(下载进度的分钟数),然后读取进度百分比a_i
。 - 对于每个进度百分比,计算对应的格数。
- 根据格数构建进度条并输出。
#include <iostream>
#include <vector>
using namespace std;int main() {int n;cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {cin >> a[i];
}for (int i = 0; i < n; i++) {int percent = a[i];int progress = percent / 5; // 每5%表示一格// 构造进度条string bar = "|";for (int j = 0; j < progress; j++) {bar += "-";}for (int j = progress; j < 20; j++) {bar += " ";}bar += "|";// 输出进度条cout << bar << endl;
}return 0;
}
时间复杂度
- 由于每分钟我们需要进行一次进度计算,并构造一个长度为 20 的进度条字符串,时间复杂度为
O(n)
,其中n
是进度条的分钟数(1 ≤ n ≤ 20
)。
因此,时间复杂度是 O(n)
,对本题来说是非常高效的。
总结
- 这道题主要考察了如何将百分比映射到进度条的具体实现。
- 通过简单的字符串操作,我们可以高效地构建并输出每分钟的下载进度条。