先认清任务,再讨论算法
2021 CSP-J 第二轮 T4|小熊的果篮
一、完整题目
源程序文件:
fruit.cpp输入文件:
fruit.in 输出文件:fruit.out时间限制:1 秒 内存限制:512 MiB
测试点:10 个等分点,每点 10 分
题目描述
小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次编号为 1,2,…,n。连续排在一起的同一种水果称为一个“块”。
小熊每次都把每一个块中最左边的水果同时挑出,组成一个果篮。重复这一操作,直到水果全部取完。
注意,每次挑完一个果篮后,块可能发生变化。例如,两个苹果块之间唯一的桔子被挑走后,两个苹果块会合并成一个块。请计算每个果篮包含哪些水果。
输入格式
从文件 fruit.in 中读入数据。
第一行包含正整数 n,表示水果数量。
第二行包含 n 个空格分隔的整数,第 i 个数表示编号为 i 的水果种类:1 代表苹果,0 代表桔子。
输出格式
输出到文件 fruit.out 中。
输出若干行。第 i 行表示第 i 次挑出的果篮,从小到大输出该果篮中所有水果的原编号,相邻编号之间用空格分隔。
样例 1
12
1 1 0 0 1 1 1 0 1 1 0 0
1 3 5 8 9 11
2 4 6 12
7
10
第一轮有 6 个块,取出编号 1,3,5,8,9,11;剩下的原编号为 2,4,6,7,10,12,种类序列是 [1,0,1,1,1,0]。第二轮取出 2,4,6,12 后,编号 7,10 都是苹果并合并成一个块,于是第三轮取 7,第四轮取 10。
样例 2
20
1 1 1 1 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0
1 5 8 11 13 14 15 17
2 6 9 12 16 18
3 7 10 19
4 20
样例 3
见选手目录下的 fruit/fruit3.in 与 fruit/fruit3.ans。
数据范围
- 对于 10% 的数据,
n≤5; - 对于 30% 的数据,
n≤1000; - 对于 70% 的数据,
n≤50000; - 对于 100% 的数据,
1≤n≤2×10^5。
由于数据规模较大,题面建议 C/C++ 选手使用较快的输入输出方式。本讲代码已经关闭 iostream 与 stdio 的同步并解除 cin、cout 绑定。
按测试点取并集,不把重叠分数相加
勾选已掌握的路线,观察它们共同覆盖哪些测试点。这里计算的是该卷条件下的理论覆盖分,不代表程序已经通过正式评测,也不对应任何一等奖分数线。
已掌握的解法
实际提交时,须将已掌握的分支整合到同一份程序。勾选路线不会自动拼接代码。
测试点覆盖图
查看原题评分依据
逐条看懂:性质、推导与完整代码
选择一条路线,查看它为什么成立,再进入同一算法的可视化与代码追踪。
尚未输出
执行记录(最近 8 步)
用边界检查:我真的读懂了吗?
先手算,再展开解释。带入演示时会核对当前路线的适用条件。