码迷,mamicode.com
首页 > 其他好文 > 详细

题解 CF767A 【Snacktower】

时间:2020-05-09 21:03:50      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:个数   标记   mes   lse   模拟   pre   输入   cout   优化   

这题竟然没有题解,小蒟蒻就来捡个漏吧 \(\ldots\ldots\)

其实这题就是照题意模拟就行了。我的思路就是:读入完之后,将这 \(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;
}

逃(

题解 CF767A 【Snacktower】

标签:个数   标记   mes   lse   模拟   pre   输入   cout   优化   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!