【CSP-J2021普及組】T4 小熊的果籃


Solution

這道題目我們可以先把一塊的縮成一個點,比如說1 1 1 0 0,我們可以用兩個數組表示,一個是1 0,另一個是3 2,還要記錄以下頭和尾,方便輸出。
然后我們就用兩個數組,一個指向上一塊,一個指向下一塊。
每次都將每個區間減去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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM