目录
前言
其实做到16题开始,就已经都是用各种数据结构了,这也意味着你要开始学c++了。
其实也没什么好学的,一个是基础的语法(其实也没什么,把命名空间,类简单的弄明白即可)
然后就是了解一下各种数据结构,链表,栈,队列,树,优先队列,堆,简单了解。
之后要用什么数据结构,你就学什么就ok。
Description
小张在暑假时间进行了暑期社会调查。调查的内容是楼房的颜色如何影响人们的心情。于是他找到了一个楼房从左到右排成一排的小区,这个小区一共有
栋楼房,每个楼房有一个颜色
和一个高度
。小张调查的内容为每次他站在第
栋楼和第
栋楼之间向左看,他记录下此时他看到的楼房颜色数作为他的调查结果。
由于小张在暑假时间沉迷游戏来不及做实地调查,只好拜托你将调查结果告诉他。
Input
本题有多组数据。
每组数据第一行一个整数
。表示有
栋楼房从左到右排成一排。
第二行
个数,表示每个楼房的颜色
。
第三行
个数,表示每个楼房的高度
。
数据保证所有组数据的
。
Output
每组数据输出
个数,第
个数表示他站在第
栋楼和第
栋楼之间向左看,能够看到的楼房颜色数。
Notes
在从左向右看楼房的时候,左边较矮的楼房会被右边较高的楼房挡住。
思路:
来自一位同学:
17要做出来得学一下栈怎么用:
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();
}