当前位置: 首页 > news >正文

打卡信奥刷题(3169)用C++实现信奥题 P7912 [CSP-J 2021] 小熊的果篮

P7912 [CSP-J 2021] 小熊的果篮

题目描述

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

输入格式

第一行,包含一个正整数nnn,表示水果的数量。

第二行,包含nnn个空格分隔的整数,其中第iii个数表示编号为iii的水果的种类,111代表苹果,000代表桔子。

输出格式

输出若干行。

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

输入输出样例 #1

输入 #1

12 1 1 0 0 1 1 1 0 1 1 0 0

输出 #1

1 3 5 8 9 11 2 4 6 12 7 10

输入输出样例 #2

输入 #2

20 1 1 1 1 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0

输出 #2

1 5 8 11 13 14 15 17 2 6 9 12 16 18 3 7 10 19 4 20

输入输出样例 #3

输入 #3

见附件中的 fruit/fruit3.in。

输出 #3

见附件中的 fruit/fruit3.ans。

说明/提示

【样例解释 #1】

这是第一组数据的样例说明。

所有水果一开始的情况是[1,1,0,0,1,1,1,0,1,1,0,0][1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0][1,1,0,0,1,1,1,0,1,1,0,0],一共有666个块。

在第一次挑水果组成果篮的过程中,编号为1,3,5,8,9,111, 3, 5, 8, 9, 111,3,5,8,9,11的水果被挑了出来。

之后剩下的水果是[1,0,1,1,1,0][1, 0, 1, 1, 1, 0][1,0,1,1,1,0],一共444个块。

在第二次挑水果组成果篮的过程中,编号为2,4,6,122, 4, 6, 122,4,6,12的水果被挑了出来。

之后剩下的水果是[1,1][1, 1][1,1],只有111个块。

在第三次挑水果组成果篮的过程中,编号为777的水果被挑了出来。

最后剩下的水果是[1][1][1],只有111个块。

在第四次挑水果组成果篮的过程中,编号为101010的水果被挑了出来。

【数据范围】

对于10%10 \%10%的数据,n≤5n \le 5n5
对于30%30 \%30%的数据,n≤1000n \le 1000n1000
对于70%70 \%70%的数据,n≤50000n \le 50000n50000
对于100%100 \%100%的数据,1≤n≤2×1051 \le n \le 2 \times {10}^51n2×105

【提示】

由于数据规模较大,建议 C/C++ 选手使用scanfprintf语句输入、输出。

C++实现

#include<bits/stdc++.h>#defineINF200010usingnamespacestd;intn;set<int>s1,s2;//把下标扔在两个set里intmain(){scanf("%d",&n);s1.clear();s2.clear();intq;for(inti=1;i<=n;++i){scanf("%d",&q);if(q)s1.insert(i);elses2.insert(i);}s1.insert(INF);s2.insert(INF);intnw=0;boolp=*s1.begin()<*s2.begin()?0:1;while(!p&&s1.size()>1||p&&s2.size()>1)//因为有个INF,所以size要>1if(!p){nw=*s1.upper_bound(nw);//upper_bound找下一个if(nw==INF){nw=0;p=*s1.begin()<*s2.begin()?0:1;//p要重新选puts("");continue;}printf("%d ",nw);//取了,输出,删除s1.erase(nw);p=!p;//取另外一坨}else{nw=*s2.upper_bound(nw);if(nw==INF){nw=0;p=*s1.begin()<*s2.begin()?0:1;puts("");continue;}printf("%d ",nw);s2.erase(nw);p=!p;}puts("");while(s1.size()>1)printf("%d\n",*s1.begin()),s1.erase(*s1.begin());while(s2.size()>1)printf("%d\n",*s2.begin()),s2.erase(*s2.begin());return0;}

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

http://www.jsqmd.com/news/704691/

相关文章:

  • GRETNA脑网络分析终极指南:5步掌握MATLAB图论计算全流程
  • 为什么不同降AI工具效果差异这么大:技术原理和算法差异深度分析 - 还在做实验的师兄
  • 深度解析Tiled地图编辑器符号链接路径问题的系统解决方案
  • 为什么同一篇论文知网和维普AIGC检测结果不同:平台差异深度解读 - 还在做实验的师兄
  • qmc-decoder终极指南:如何快速解锁QQ音乐加密音频文件?
  • 2026年3月洁净车间不锈钢操作台直销厂家推荐,洁净车间不锈钢操作台/工具柜,洁净车间不锈钢操作台厂商怎么选择 - 品牌推荐师
  • Rust的#[repr(C)]跨平台
  • Vercel agent-skills:为AI编码助手注入专业开发技能
  • 打卡信奥刷题(3170)用C++实现信奥题 P7915 [CSP-S 2021] 回文
  • 5分钟快速上手:用Arcade-plus制作你的第一个Arcaea谱面![特殊字符]
  • 嘎嘎降AI和PaperRR哪个更适合英文论文:2026年Turnitin检测对比 - 还在做实验的师兄
  • Venera漫画源自动更新终极指南:5分钟掌握智能同步技术
  • 深入浅出 Kubernetes 网络【20260426-002篇】
  • ANSYS WORKBENCH轴承动力学仿真:内外圈及故障特征频率振动加速度模拟研究
  • 终极开源电视浏览器:TV Bro重构大屏浏览新体验
  • Python解析Excel:从入门到实战
  • 独立开发日志:把 GPS 轨迹换算成「踩过的面积」,我删了三次代码才勉强做对
  • 嘎嘎降AI和去AIGC哪个更适合理工科论文:2026年实测数据完整对比 - 还在做实验的师兄
  • 基于Verilog语言的FPGA密码锁工程:通过矩阵键盘实现密码修改与开锁(包含Quartus...
  • 淘宝API错误码处理大全:常见27种错误码的应对策略
  • AutoDock-Vina实战指南:从分子对接新手到专业研究者的3个关键步骤
  • Refined Now Playing:网易云音乐美化插件终极指南,打造沉浸式播放体验
  • Linux线程同步与互斥(五):线程池的全面实现
  • 如何用Umi-OCR告别截图文字手打?离线OCR的5个效率倍增技巧
  • 比较能源系统优化调度的深度强化学习算法:DDPG、TD3、SAC和PPO的性能与可行性
  • 多模态传感器自动校准技术解析与应用实践
  • 深入浅出 Kubernetes 网络【20260426-003篇】
  • 5分钟掌握EB Garamond 12:免费商用复古字体终极指南
  • 【OpenClaw养虾】从零开始部署安装,接入机器人
  • 使用 Operator 框架管理有状态应用