深信服面试(2019)小木板

题目:输入的数据a代表每列小木板的个数,每列之间小木板的距离是1,输出可以存多少水,水不会从底部流出,只会从侧面流出。(题目没有截图)

输入三行的数据,T是测试几次,n是有几个数据,a是数据
T
n
a1 a2 a3 …
输出T行数据。
例:
输入
1
3
2 1 3
输出
4

#include <iostream>
using namespace std;
int main()
{
	int T;
	cin >> T;
	int **parr_board = new int*[T];
	int *arr_board_num = new int[T];
	//循环读取数据
	for (int i = 0; i < T; ++i)
	{
		cin >> arr_board_num[i];
		parr_board[i] = new int[arr_board_num[i]];
		for (int j = 0; j < arr_board_num[i]; ++j)
		{
			cin >> parr_board[i][j];
		}
	}
	//判断水量
	for (int i = 0; i < T; ++i)
	{
		int water_num = 0,j=1,index = 1;
		//左边木板数
		int left = parr_board[i][0];
		int left_index = 0;
		//右边木板数
		int right = parr_board[i][j];
		/*
		愚蠢的办法,有好方法的分享一下,[email protected]
		思路是,从左边开始找,直到找到一个大于左边木板数的位置,就计算一次水量,
		然后在把这个位置木板数更新为新的左边木板数,一直重复
		特殊情况就是最右边的木板比左边的小,
		*/
	    while(1)
		{
			if (right >= left)
			{
				water_num += (left * index);
				index = 1;
				left = parr_board[i][j];
				left_index = j;
				++j;
				right = parr_board[i][j];
			}
			else
			{
				++index;
				++j;
				right = parr_board[i][j];

			}
			if (j == arr_board_num[i] - 1)
			{
				if (right < left)
				{
					int k = j;
					while (1)
					{
						k--;
						if (right < parr_board[i][k])
							break;
					}
					water_num += (right * (j-k));
					water_num += (parr_board[i][k] * (k - left_index));
				}
				else
				{
					water_num += (left * index);
				}
				break;
			}
		}
		cout << water_num << endl;
	}
	//释放申请内存
	for (int i = 0; i < T; ++i)
	{
		delete parr_board[i];
	}
	delete arr_board_num;
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/A_wangc/article/details/82807685