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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

Solution

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

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

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

Code

#include<bits/stdc++.h>
using namespace std;
int n,a[200005],m,t[200005],w[200005],last[200005],nxt[200005],kind[200005],bz[200005];
int main()
{
//	freopen("fruit.in","r",stdin);
//	freopen("fruit.out","w",stdout);
	int len=1,first=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) last[i]=i-1,nxt[i-1]=i;
	for(int i=2;i<=n;i++)
		if(a[i]!=a[i-1])
			m++,t[m]=first,w[m]=i-1,len=1,first=i,kind[m]=a[i-1];
	m++,t[m]=first,w[m]=n,kind[m]=a[n];
	len=n;
	while(len)
	{
		for(int i=nxt[0];i<=m;i=nxt[i])
		{
			if(i==0) break;
			if(kind[i]==kind[last[i]]&&last[i]!=0) continue;
			if(last[i]!=0) printf(" ");
			printf("%d",t[i]),len--,t[i]++;
		}
		for(int i=1;i<=m;i=nxt[i])
			if(t[i]>w[i]) nxt[last[i]]=nxt[i],last[nxt[i]]=last[i];
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值