zoukankan      html  css  js  c++  java
  • 题解 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;
    }
    

    逃(

  • 相关阅读:
    Python3 模块基础
    Python3 函数小练习
    Python3 函数进阶3
    Python3 函数进阶2
    Python3 函数进阶1
    Python3 函数实践之简易购物系统
    线程之间的通信
    volatile 关键字
    对象锁的同步与异步
    synchronized 关键字
  • 原文地址:https://www.cnblogs.com/win10crz/p/12859705.html
Copyright © 2011-2022 走看看