• 题解 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;
    }
    

    逃(

  • 相关阅读:
    39.前端需要注意哪些SEO
    38.http的几种请求方法和区别
    37.伪元素和伪类的区别
    35.如何实现页面每次打开时清除本页缓存
    Jmeter工具设置中文版(切换显示语言)
    soapui测试http接口
    【C++】《Effective C++》第三章
    【C++】《Effective C++》第二章
    【设计模式】面向对象设计原则
    【设计模式】设计模式概述
  • 原文地址:https://www.cnblogs.com/win10crz/p/12859705.html
Copyright © 2020-2023  润新知