n个高度为h的木板(只考虑高度和长度),木板间隔为1 注入水后,求接到的水数量

例如:
木板高度:1,2,3,1---- 11 + 21 + 11 = 4 水量
木板高度:1,2,1,4---- 1
1 + 22 = 3 水量
木板高度:2,1,3---- 2
2 = 4 水量
木板高度:4,2,3,1-- 32 + 11 = 7 水量
基本思路:
以最大的数为中间数,分开计算;
当指针运动到下一个比a大的数或者运动到max地址的时候停止;

源代码:

#define n 10
#include <stdio.h>

int main(int argc, char *argv[])
{
	int h[n] = {4,2,3,5,2,5,3,5,5,2};	//测试数组
	int *pstart = h;	//数组首位
	int *pend = pstart + n - 1;	//数组尾位
	int *pmax = pstart;		//用于存储数组最大的数的地址,初始化为第一个数
	int *p;		//定义跑动的指针并

	while(p != pend)		//得到最大的数
	{
		if(*pmax < *p)
			pmax = p;
		p++;
	}
	//printf("max=%d, %p\n", *pmax, pmax);

	p = pstart;		//初始化为第一个数
	int a = *p;		//临时变量,存放当前地址的值
	int b = 0;		//临时变量,存放下一个地址的值
	int count =  1;	//计数a和b之间的宽度
	int sum = 0;	//用于存放结果

	while(p != pmax)	//计算max之前存储的水量
	{
		a = *p;			
		count = 1;
		while(a > *(p+1) && p+1 != pmax)	
		{
			count++;
			p++;	
		}
		p++;		//让p开始跑动
		b = *p;
		if(a <= b)
			sum = sum + a * count;
		else
			sum = sum + b * count;
	//printf("sum=%d\n",sum);
	}
	
	p = pend;	//将p移动到数组最后
	b = 0;
	while(p != pmax)	//计算max之后存储的水量
	{
		a = *p;
		count = 1;
		while(a > *(p-1) && p-1 != pmax)
		{
			count++;
			p--;
		}
		p--;
		b = *p;
		if(a <= b)
			sum = sum + a * count;
		else
			sum = sum + b * count;
	//printf("sum=%d\n",sum);
	}
	printf("sum=%d\n",sum);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值