当前位置:   article > 正文

CSP-J 2021 小熊的果篮_[csp-j 2021] 小熊的果篮

[csp-j 2021] 小熊的果篮

        我家小宇在洛谷上刷题,碰到这一道,他解题后,时间复杂度一直拿不到满分。贴一下我辅导他时写的代码。

题目描述    

        小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里,具体方法是:每次都把每一个“块”中最左边的水果同时挑出,组成一个果篮。重复这一操作,直至水果用完。注意,每次挑完一个果篮后,“块”可能会发生变化。比如两个苹果“块”之间的唯一桔子被挑走后,两个苹果“块”就变成了一个“块”。请帮小熊计算每个果篮里包含的水果。

输入格式

第一行,包含一个正整数 n,表示水果的数量。第二行,包含 n 个空格分隔的整数,其中第 i 个数表示编号为 i 的水果的种类,1 代表苹果,0 代表桔子。

输出格式

输出若干行。

第 i 行表示第 i 次挑出的水果组成的果篮。从小到大排序输出该果篮中所有水果的编号,每两个编号之间用一个空格分隔

输入输出样例

  1. 输入样例一:
  2. 12
  3. 1 1 0 0 1 1 1 0 1 1 0 0
  4. 输出样例一:
  5. 1 3 5 8 9 11
  6. 2 4 6 12
  7. 7
  8. 10
  9. 输入样例二:
  10. 20
  11. 1 1 1 1 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0
  12. 输出样例二:
  13. 1 5 8 11 13 14 15 17
  14. 2 6 9 12 16 18
  15. 3 7 10 19
  16. 4 20

代码实例

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. using namespace std;
  5. struct block
  6. {
  7. int value;
  8. int count;
  9. int begin;
  10. };
  11. int main()
  12. {
  13. int n = 0;
  14. scanf("%d", &n);
  15. vector<block> myblocks;
  16. int intput = 0;
  17. for (int i=1; i<=n; i++)
  18. {
  19. scanf("%d", &intput);
  20. if (0 == myblocks.size())
  21. {
  22. block first_block;
  23. first_block.value = intput;
  24. first_block.count = 1;
  25. first_block.begin = i;
  26. myblocks.push_back(first_block);
  27. }
  28. else
  29. {
  30. block &cur_block = myblocks.back();
  31. if (intput == cur_block.value)
  32. {
  33. cur_block.count++;
  34. }
  35. else
  36. {
  37. block new_block;
  38. new_block.value = intput;
  39. new_block.begin = i;
  40. new_block.count = 1;
  41. myblocks.push_back(new_block);
  42. }
  43. }
  44. }
  45. while (0 != myblocks.size())
  46. {
  47. vector<block>::iterator iter = myblocks.begin();
  48. int cur_value = -1;
  49. while (iter != myblocks.end())
  50. {
  51. if (0==(*iter).count)
  52. {
  53. iter = myblocks.erase(iter);
  54. continue;
  55. }
  56. else
  57. {
  58. if (cur_value != (*iter).value)
  59. {
  60. cout << (*iter).begin << ' ';
  61. cur_value = (*iter).value;
  62. (*iter).begin++;
  63. (*iter).count--;
  64. }
  65. iter++;
  66. }
  67. }
  68. cout << endl;
  69. }
  70. return 0;
  71. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/606534
推荐阅读
相关标签
  

闽ICP备14008679号