一、题目描述

Description

小张在暑假时间进行了暑期社会调查。调查的内容是楼房的颜色如何影响人们的心情。于是他找到了一个楼房从左到右排成一排的小区,这个小区一共有 n 栋楼房,每个楼房有一个颜色 c 和一个高度 h 。小张调查的内容为每次他站在第 i 栋楼和第 i+1 栋楼之间向左看,他记录下此时他看到的楼房颜色数作为他的调查结果。

由于小张在暑假时间沉迷游戏来不及做实地调查,只好拜托你将调查结果告诉他。

Input

本题有多组数据。

每组数据第一行一个整数 n 。表示有 n 栋楼房从左到右排成一排。

第二行 n 个数,表示每个楼房的颜色(1≤ c ≤ 1e6)。

第三行 n 个数,表示每个楼房的高度(1≤ h ≤ 1e9)。

数据保证所有组数据的 Σn ≤ 1e6 。

Output

每组数据输出 n 个数,第 i 个数表示他站在第 i 栋楼和第 i+1 栋楼之间向左看,能够看到的楼房颜色数。

Notes

在从左向右看楼房的时候,左边较矮的楼房会被右边较高的楼房挡住。

测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示

  1. 2↵
  2. 5↵
  3. 1 2 3 4 5↵
  4. 1 3 4 2 5↵
  5. 5↵
  6. 1 2 4 4 5↵
  7. 1 3 4 2 5↵
以文本方式显示

  1. 1 1 1 2 1↵
  2. 1 1 1 1 1↵
1秒 64M 0

二、思路过程

小张的故事告诉我们,暑假不要过度沉迷游戏,以致于该做的作业都被落下。

小张的故事还警戒我们,就算自己的事情做不完,也不应该去麻烦一个陌生人,就好像我debug了一个上午,现在只想让小张退学。

可他竟然可以让程序设计的老师无偿帮他,有黑幕啊!

栈的基本应用。

这道题非常基础,入栈,出栈,取栈顶元素,等等。这是一道帮助新手(我)快速入门栈的简单题目。

我们需要让楼高入栈,确保从栈底到栈顶是递减的,栈内每一个元素就是我们在当前位置所能看到的每一栋楼房;在此基础上,统计这些楼房的颜色有几种,就是我们观察到的颜色数量。我们不关心一种颜色有多少个,但是我们关心的是有多少种颜色,非常适合采用“桶”。


三、代码实现

头文件

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;

声明栈体(没什么好说的,就是书上的内容)

struct st {int h[1000010],c[1000010];int front = 0;void push( int height , int color ) {h [ front ] = height; c [ front ] = color;front++ ;}void pop() {if ( front > 0 ) front-- ;}int toph() {if ( front > 0 ) return h [ front-1 ];}int topc() {if ( front > 0 ) return c [ front-1 ];}int size() {return front;}
};

在这样的一个栈里,有楼房的高度height和楼房的颜色color两个信息,它们作为一个整体共同放在栈顶。

对每一组数据:

int color_num = 0; //color_num用来计数。int n;
scanf("%d",&n); //有n栋楼
struct st stack;for ( int i=0 ; i<n ; i++ ) { scanf( "%d" , & building_c[i] ); bucket_color[i+1] = 0;
//bucket_color[]指的是桶中的颜色。
//当bucket_color由0变为1时,color_num加1;当bucket_color由1变为0时,color_num减1
}for ( int i=0 ; i<n ; i++ ) {int building_h;scanf( "%d" , & building_h );//小元素出栈while ( stack.size()  &&  stack.toph() <= building_h ) {bucket_color[ stack.topc() ] --;if ( bucket_color[ stack.topc() ] == 0 ) color_num--;stack.pop();}//新元素入栈
stack.push(building_h,building_c[i]);//当元素出入栈时,对应的颜色数也要立刻变化
bucket_color[ stack.topc() ] ++;
if ( bucket_color[ stack.topc() ] == 1 ) color_num++;if (i!=n-1) cout << color_num << ' ';
else cout << color_num << endl;

这里我还想补充一点:我一整个上午改来改去始终超时的原因竟然是——cin读入的速度比scanf慢!小细节决定大成败!虽然cin读入更加方便,但是当数据量庞大的时候,scanf是一个更好的选择。


四、完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int building_c[N],bucket_color[N]; struct st {int h[1000010],c[1000010];int front = 0;void push(int height,int color) {h[ front ] = height; c[ front ] = color;front++;}void pop() {if (front > 0) front--;}int toph() {if (front > 0) return h[front-1];}int topc() {if (front > 0) return c[front-1];}int size() {return front;}
};int main(){int m;scanf("%d",&m); //有m组数据for (int j=0;j<m;j++) {int n;scanf("%d",&n); //有n栋楼struct st stack;for (int i=0;i<n;i++) {    scanf("%d",&building_c[i]); bucket_color[i+1] = 0; }int color_num = 0;for (int i=0;i<n;i++) {int building_h;scanf("%d",&building_h);while ( stack.size()  &&  stack.toph() <= building_h ) {bucket_color[ stack.topc() ] --;if ( bucket_color[ stack.topc() ] == 0 ) color_num--;stack.pop();}stack.push(building_h,building_c[i]);bucket_color[ stack.topc() ] ++;if ( bucket_color[ stack.topc() ] == 1 ) color_num++;if (i!=n-1) cout << color_num << ' ';else cout << color_num << endl;}}return 0;
}

总结:这道题目不难,目的是帮助新手快速入手栈的基本操作。

看楼房 | C++ | 栈相关推荐

  1. 纸上得来终觉浅,可以这里看一眼---->栈和队列(下)

    目录 括号匹配问题 用两个队列实现栈 用两个栈实现队列 设计循环队列 在上一篇博客里面,我们讲了栈和队列的性质以及栈和队列的模拟实现,那么这两个数据结构的特殊性质有什么应用场景呢?或者更直接一点,面试 ...

  2. 简单看java异常栈

    (stack trace)异常栈轨迹是指: 当 throw Throwable 时, Throwable对象抛出过程(穿梭)所经历的多个方法调用层(方法调用栈).越接近 throw 语句的方法先进入异 ...

  3. 看动画学算法之:栈stack

    文章目录 简介 栈的构成 栈的实现 使用数组来实现栈 使用动态数组来实现栈 使用链表来实现 简介 栈应该是一种非常简单并且非常有用的数据结构了.栈的特点就是先进后出FILO或者后进先出LIFO. 实际 ...

  4. java栈 迷宫_利用栈实现迷宫的求解

    问题描述:这时实验心理学中的一个典型的问题,心理学家吧一只老鼠从一个无顶的大盒子的入口处赶进迷宫.迷宫设置很多隔壁,对前进方向形成了许多障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠仔迷宫中 ...

  5. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

  6. 想客户之所想 华为全栈云加速行业云化创新

    如今,行业用户从"想上云"到"真正将业务和数据迁移到云上",这中间一直存在一条鸿沟.无论是运营商.金融行业,还是政府.大中型企业,他们都拥有一套比较成熟的IT体 ...

  7. 《大话数据结构》读书笔记-栈与队列

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...

  8. 数据结构与算法(2)——栈和队列

    前言:题图无关,只是好看,接下来就来复习一下栈和队列的相关知识 前序文章: 数据结构与算法(1)--数组与链表(https://www.jianshu.com/p/7b93b3570875) 栈 什么 ...

  9. 1.16 Java的异常跟踪栈

    异常对象的 printStackTrace() 方法用于打印异常的跟踪栈信息,根据 printStackTrace() 方法的输出结果,开发者可以找到异常的源头,并跟踪到异常一路触发的过程. 看下面用 ...

最新文章

  1. 计算机操作系统32跟64区别是什么,32位和64位计算机操作系统之间的区别32位和64位win7系统之间的区别...
  2. LL-verilog语法多位宽全加器
  3. php websocket 是否在线_看完让你彻底理解WebSocket原理,附实战代码(包含前端和后端)...
  4. 十二个 ASP.NET Core 例子
  5. tcp的3次握手4次挥手
  6. php html区别_php与html区别
  7. java页面渲染_史上最详细的页面渲染机制
  8. vsto mysql_VSTO–Visio | 学步园
  9. 魅族android密码,魅族手机Flyme账户密码或密保忘记解决办法
  10. megacli通过盘符定位物理盘_Megaraid 磁盘定位
  11. 【电商】电商后台设计—订单中心
  12. python小学口算题库生成器_口算题自动生成的小程序-L.A.SMILE自家用软件-口算题生成下载20060207-西西软件下载...
  13. GIS空间分析 缓冲区分析与叠加分析1 选址分析(市区择房)
  14. 能量英语(三) 之 “情感把控 II ”
  15. TRIMMEAN函数实例:评委打分计算最后得分
  16. 使用docker快速体验OceanBase(Win10 Home)
  17. 大学三年颠沛流离换来京东实习Offer
  18. AutoCAD 2021绿色中文精简版
  19. 数据结构与算法-二叉树
  20. postgresql 备份 还原

热门文章

  1. 字节跳动 测试开发实习生 面经
  2. Centos7 学习记录
  3. merge函数_merge函数
  4. Java网络蜘蛛/网络爬虫 Spiderman
  5. 【Stream流、方法引用】
  6. 消费者购买行为的类型(3)
  7. 谈谈3D打印成本之中的奥秘
  8. C++学习之两种向下转型
  9. face detection[DSFD]
  10. SQL 递归查询所有父子节点