这题竟然没有题解,小蒟蒻就来捡个漏吧 (ldotsldots)
其实这题就是照题意模拟就行了。我的思路就是:读入完之后,将这 (n) 个数从头到尾进行一次扫描,用一个布尔型的数组记录 (1) 到 (n) 这些尺寸是否出现过。
在每个循环的开始,将当前天的零食的尺寸标记为出现过。
然后再进入一个循环,从 (n) 循环到 (1),也就是零食塔的从下往上的尺寸。如果 (i) 这个尺寸已经出现,就输出,并把 (i) 再标记为未出现,防止下次循环重复输出;否则,就立刻跳出循环。(具体看代码注释)
原始代码:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define rg register
int n,a[MAXN];
bool book[MAXN];
int main()
{
cin>>n;
for(rg int i=1;i<=n;++i)
cin>>a[i]; //输入部分。
for(rg int i=1;i<=n;++i)
{
book[a[i]]=1; //标记当前的尺寸出现过。
for(rg int j=n;j>=1;j--)
{
if(book[j]==1) //如果这个尺寸出现过,就输出。
{
cout<<j<<" ";
book[j]=0; //重新标记为未出现。
}
else
break; //否则立即跳出。
}
cout<<endl; //不要忘了换行。
}
return 0;
}
其实还可以优化,用一个变量记录目前未输出的最大的尺寸,第二个循环就可以从这个变量开始。
优化过代码:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define rg register
int n,a[MAXN],now; //now 用来记录目前未输出的最大零食尺寸。
bool book[MAXN];
int main()
{
cin>>n;
now=n; //初始化为 n。
for(rg int i=1;i<=n;++i)
cin>>a[i];
for(rg int i=1;i<=n;++i)
{
book[a[i]]=1;
for(rg int j=now;j>=1;j--)
{
if(book[j]==1)
cout<<j<<" "; //因为每次是从未输出的开始,已输出的就不用标记。
else
{
now=j; //更新 now。
break;
}
}
cout<<endl;
}
return 0;
}
逃(