题解 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;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!