题解 CF1492B【Card Deck】

概述

题号 难度 \(AC\)时间及记录
\(\texttt{CF1492B}\) \(\texttt{洛谷难度:暂无评定}\) \(\texttt{On 2021/02/24}\)

解析

我们考虑贪心。
每一次我们找到当前最大的数,
然后把它后面的数以及它都提到答案里。
然后再在新的数列中找最大的数,
再重复以上步骤。
或许用到了一点点进位制的思想 \(\ldots\)
证明也比较简单:

不难想到,我们一定要把最大的数放到最前面。那么同理我们就可以想到这种贪心方法。

然后你就得到了 \(\texttt{AC}\)

代码

#include<bits/stdc++.h>
using namespace std;
int Array[100001];
int Tong[100001];
bool P[100001];
queue< int >Stack[100001];
int main(void)
{
	// freopen("In.in","r",stdin);
	register int Case;
	cin>>Case;
	while(Case--)
	{
		register int i,j;
		register int N;
		cin>>N;
		register int X;
		X=N;
		memset(P,false,sizeof(P));
		for(i=1;i<=N;i++)
		{
			cin>>Array[i];
			Tong[Array[i]]=i;
		}
		register int Cnt;
		Cnt=0;
		for(i=N;i>=1;i--)
		{
			if(!P[i])
			{
				Cnt++;
				for(j=Tong[i];j<=X;j++)
				{
					Stack[Cnt].push(Array[j]);
					P[Array[j]]=true;
				}
				X=Tong[i]-1;
			}
		}
		for(i=1;i<=Cnt;i++)
		{
			while(!Stack[i].empty())
			{
				cout<<Stack[i].front()<<' ';
				Stack[i].pop();
			}
		}
		cout<<endl;
	}
	return 0;
}
posted @ 2021-02-24 10:13  Bushuai_Tang  阅读(38)  评论(0编辑  收藏  举报