0
点赞
收藏
分享

微信扫一扫

蓝桥杯2022省赛C/C++B组D题

晒大太阳了 2022-04-13 阅读 69

修剪灌木

爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。

输入格式 :

一个正整数 N ,含义如题面所述。

输出格式 :

输出 N 行,每行一个整数,第i行表示从左到右第 i 棵树最高能长到多高。

样例输入 :

3

样例输出 :

4
2
4

这是一道关于数组的模拟题

建立一个数组初值为 1 , 嵌套两个循环,第一个循环代表天数,第二个循环对每一天的树木长度变化作出改变。

分析测试案例 : 输入 3 颗树木

第一天晚 1 1 1 修剪以后 0 1 1

第二天晚 1 2 2 修剪以后 1 0 2

第三天晚 2 1 3 修剪以后 2 1 0

第四天晚 3 2 1 修剪以后 3 0 1

第五天晚 4 1 2 修剪以后 0 1 2

第六天晚 1 2 3 修剪以后 1 0 3

第七天晚 2 1 4 修剪以后 2 1 0

第八天晚 3 2 1 修剪以后 3 0 1

通过分析发现,将范围缩小至来回一个半循环,就能找出每个树木对应的最大长度,为了保险所以我们将天数设置为 3 * n 天。

在每个天数循环里,我们对实际的tree数组进行相应操作即可。

那么还有一个问题是,当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。

这里我的解决方法是,将每次要置零的树木下标都存放在一个index数组中, 通过这个index数组来找出对应天数置零的数组下标。

最后解决每个树木最大值问题,建立一个max数组,实时更新每个树木的长度变化,每当树木出现最大值,就更新max数组。

最后附上代码 :

/*
 * @Name: hjc  Email : jchuan_Hou@163.com
 * @Data: 2022年4月10日09:09:35
 * @Describe: LQ_CB_D 修剪树木
 */
#include <iostream>

using namespace std;

int index[100001];
int n;

int main()
{
	cin >> n;
	int * tree = new int[n];
	int * max = new int[n];
	//初始化下标数组
	int flag = 0;
	int j = 0;
	for (int i = 0; i < 3 * n; i++)
	{
		index[i] = j;
		if(flag == 0)
		{
			j++;
		}
		else if (flag == 1)
		{
			j--;
		}
		if (j == n - 1)
		{
			flag = 1;
		}
		if (j == 0)
		{
			flag = 0;
		}
	}
	
	//初始化max数组
	for (int i = 0; i < n; i++)
	{
		max[i] = 0;
	} 
	
/*	for (int i = 0; i < 2 * n + 1; i++)
	{
		cout << index[i] << " ";
	}
	cout << endl;*/
	
	
	for (int i = 0; i < n; i++)
	{
		tree[i] = 1;//初始化为 1
	}

	
	for (int i = 0, j = 0; i < 3 * n; i++)
	{
		tree[index[i]] = 0;
		for (int t = 0; t < n; t++)
		{
			tree[t] = tree[t] + 1;
			if (max[t] < tree[t]) max[t] = tree[t];
		}
	}
	
	for (int i = 0; i < n; i++)
	{
		cout << max[i] << endl;
	}
	
	return 0;
}
举报

相关推荐

0 条评论