赞
踩
我家小宇在洛谷上刷题,碰到这一道,他解题后,时间复杂度一直拿不到满分。贴一下我辅导他时写的代码。
小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里,具体方法是:每次都把每一个“块”中最左边的水果同时挑出,组成一个果篮。重复这一操作,直至水果用完。注意,每次挑完一个果篮后,“块”可能会发生变化。比如两个苹果“块”之间的唯一桔子被挑走后,两个苹果“块”就变成了一个“块”。请帮小熊计算每个果篮里包含的水果。
第一行,包含一个正整数 n,表示水果的数量。第二行,包含 n 个空格分隔的整数,其中第 i 个数表示编号为 i 的水果的种类,1 代表苹果,0 代表桔子。
输出若干行。
第 i 行表示第 i 次挑出的水果组成的果篮。从小到大排序输出该果篮中所有水果的编号,每两个编号之间用一个空格分隔
- 输入样例一:
- 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
-
- 输入样例二:
- 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
- #include <iostream>
- #include <cstdio>
- #include <vector>
- using namespace std;
-
- struct block
- {
- int value;
- int count;
- int begin;
- };
-
- int main()
- {
- int n = 0;
- scanf("%d", &n);
-
- vector<block> myblocks;
- int intput = 0;
- for (int i=1; i<=n; i++)
- {
- scanf("%d", &intput);
- if (0 == myblocks.size())
- {
- block first_block;
- first_block.value = intput;
- first_block.count = 1;
- first_block.begin = i;
- myblocks.push_back(first_block);
- }
- else
- {
- block &cur_block = myblocks.back();
-
- if (intput == cur_block.value)
- {
- cur_block.count++;
- }
- else
- {
- block new_block;
- new_block.value = intput;
- new_block.begin = i;
- new_block.count = 1;
- myblocks.push_back(new_block);
- }
- }
-
- }
-
- while (0 != myblocks.size())
- {
- vector<block>::iterator iter = myblocks.begin();
- int cur_value = -1;
- while (iter != myblocks.end())
- {
- if (0==(*iter).count)
- {
- iter = myblocks.erase(iter);
- continue;
- }
- else
- {
- if (cur_value != (*iter).value)
- {
- cout << (*iter).begin << ' ';
- cur_value = (*iter).value;
- (*iter).begin++;
- (*iter).count--;
- }
- iter++;
- }
- }
- cout << endl;
- }
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。