【第十七题】看楼房(北理工/北京理工大学/程序设计方法与实践/小学期 )

目录

前言

Description

思路:

17要做出来得学一下栈怎么用:

C++代码


前言

其实做到16题开始,就已经都是用各种数据结构了,这也意味着你要开始学c++了。

其实也没什么好学的,一个是基础的语法(其实也没什么,把命名空间,类简单的弄明白即可)

然后就是了解一下各种数据结构,链表,栈,队列,树,优先队列,堆,简单了解。

之后要用什么数据结构,你就学什么就ok。

Description

小张在暑假时间进行了暑期社会调查。调查的内容是楼房的颜色如何影响人们的心情。于是他找到了一个楼房从左到右排成一排的小区,这个小区一共有

n

栋楼房,每个楼房有一个颜色

c_i

和一个高度

h_i

。小张调查的内容为每次他站在第

i

栋楼和第

i+1

栋楼之间向左看,他记录下此时他看到的楼房颜色数作为他的调查结果。

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

Input

本题有多组数据。

每组数据第一行一个整数

n

。表示有

n

栋楼房从左到右排成一排。

第二行

n

个数,表示每个楼房的颜色

(1 \leq c_i \leq 10^6 )

第三行

n

个数,表示每个楼房的高度

(1 \leq c_i \leq 10^9 )

数据保证所有组数据的

\sum{n} \leq 1000000

Output

每组数据输出

n

个数,第

i

个数表示他站在第

i

栋楼和第

i+1

栋楼之间向左看,能够看到的楼房颜色数。

Notes

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

思路:

来自一位同学:

17要做出来得学一下栈怎么用

C++数据结构——栈_GeekZW的博客-CSDN博客_c++栈

C++代码

 其实我封装了个寂寞,3行代码复用个锤子,大家写的时候不用管

#include<cstdio>
#include<stack>
#include<cstring>
#define WIDTH 1000010
using namespace std;
void in(void);
void out(void);
int T, i, n, temp;
int color_ct[WIDTH];//标为color,值为总数
int color[WIDTH];
int height[WIDTH];
int color_class;
stack <int> stack_color, stack_height;

int main(void)
{
//	freopen("input.txt", "r", stdin);
	scanf("%d", &T);
	while (T-- > 0)
	{
		//清空栈,计数器,读入一组,存到数组,
		while (!stack_color.empty())
		{
			stack_color.pop();
			stack_height.pop();
		}
		memset(color_ct, 0, sizeof color_ct);
		color_class = 0;
		scanf("%d", &n);
		for (i = 0; i < n; i++)
			scanf("%d", &color[i]);
		for (i = 0; i < n; i++)
			scanf("%d", &height[i]);
		//逐个处理
		for (i = 0; i < n; i++)
		{
			if (stack_height.empty()|| height[i] < stack_height.top())
				in();
			else //非空,且遮挡
			{
				while (!stack_height.empty()&& height[i] >= stack_height.top())//清理遮挡项目
					out();
				//此时已经把被遮挡的清理光了,填入
					//本来是想封装成函数,重复利用,但是我懒得去清空栈了
				if (stack_height.empty()|| height[i] < stack_height.top())
					in();
			}
			printf("%d%c", color_class, i == n - 1 ? '\n' : ' ');
		}
	}

	return 0;
}
void in(void)
{
	stack_color.push(color[i]);
	stack_height.push(height[i]);
	if (++color_ct[color[i]] == 1)//先++再判断是否原来是0
		color_class++;//原来是0的话就多一种
}
void out(void)
{
	if (--color_ct[stack_color.top()] == 0)//找到顶部color值,计数的--,如果没了就减class
		color_class--;
	stack_height.pop();
	stack_color.pop();
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦梦亦醒乐逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值