【CSP-J2021普及组】T4 小熊的果篮

博主分享了考场上的解决方案,通过数组和指针技巧高效管理水果分配问题。展示了如何用两个数组表示不同区域的水果,并通过迭代更新来输出结果。

这个是我考场的思路,有点小问题,但不大。(能A)

upd:好像被卡了……大家图个乐子吧,太久也懒得改了。

Solution

这道题目我们可以先把一块的缩成一个点,比如说 1 1 1 0 01\ 1\ 1\ 0\ 01 1 1 0 0,我们可以用两个数组表示,一个是 1 01\ 01 0,另一个是 3 23\ 23 2,还要记录以下头和尾,方便输出。

然后我们就用两个数组,一个指向上一块,一个指向下一块。

每次都将每个区间减去 111,在判断一下是否还有水果,如果没有,就将他的上一位指向他的下一位,让他的下一位指向他的上一位,输出就把他的头输出就可以了,头记得加 111

Code

#include<bits/stdc++.h>
using namespace std;
int n,a[200005],m,t[200005
CSP - J20214小熊果篮问题,要求将一排水果按“块”中最左边水果挑出组成果篮,直至水果用完。以下是使用Java语言实现该问题的代码: ```java import java.util.*; class Block { int start; int end; int value; public Block(int start, int end, int value) { this.start = start; this.end = end; this.value = value; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] fruits = new int[n]; for (int i = 0; i < n; i++) { fruits[i] = scanner.nextInt(); } List<Block> blocks = new ArrayList<>(); int start = 0; for (int i = 1; i <= n; i++) { if (i == n || fruits[i] != fruits[i - 1]) { blocks.add(new Block(start, i - 1, fruits[start])); start = i; } } while (!blocks.isEmpty()) { List<Integer> basket = new ArrayList<>(); List<Block> newBlocks = new ArrayList<>(); for (int i = 0; i < blocks.size(); i++) { Block block = blocks.get(i); basket.add(block.start + 1); block.start++; if (block.start <= block.end) { newBlocks.add(block); } } // 合并相邻同类型块 if (!newBlocks.isEmpty()) { List<Block> mergedBlocks = new ArrayList<>(); Block current = newBlocks.get(0); for (int i = 1; i < newBlocks.size(); i++) { Block next = newBlocks.get(i); if (next.value == current.value) { current.end = next.end; } else { mergedBlocks.add(current); current = next; } } mergedBlocks.add(current); newBlocks = mergedBlocks; } Collections.sort(basket); for (int i = 0; i < basket.size(); i++) { System.out.print(basket.get(i)); if (i < basket.size() - 1) { System.out.print(" "); } } System.out.println(); blocks = newBlocks; } } } ``` 上述代码首先读取输入的水果数量和每个水果的类型,将水果按“块”进行划分。然后在每次循环中,从每个“块”中取出最左边的水果组成果篮,并更新“块”的信息。若相邻“块”为同一种水果,则将它们合并。最后输出每个果篮中水果的编号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值