题解 CF767A 【Snacktower】

这题竟然没有题解,小蒟蒻就来捡个漏吧 (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;
}

逃(

原文地址:https://www.cnblogs.com/win10crz/p/12859705.html