题目:输入的数据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;
}