E. Water Balance(思维+单调栈+平均数)

https://codeforces.com/contest/1300/problem/E


思路:如果进行考虑呢?

假设现在有一段区间平均值为x1,有一段区间平均值为x2,现在新加入一个x3。

如果x3<x2,那么必然x3加入是能使平均分降低的,所以把x3加入到x2.那么再看新的x2''是不是小于x1,如果小就加入,不小就继续往后枚举,每次进行判断。

类似单调栈的模拟。

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e6+100;
typedef long long LL;
double a[maxn],st[maxn],len[maxn];
LL pos=0;
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  LL n;cin>>n;
  for(LL i=1;i<=n;i++) {
  	LL x;cin>>x;a[i]=1.0*x;
  }
  for(LL i=1;i<=n;i++)
  {
  	st[++pos]=a[i];
	len[pos]=1;
	while(pos>1&&st[pos]<st[pos-1])
	{
		st[pos-1]=1.0*(st[pos]*len[pos]+st[pos-1]*len[pos-1])/(len[pos]+len[pos-1]);
		len[pos-1]=len[pos-1]+len[pos];
		pos--;	
	}	
  }
  for(LL i=1;i<=pos;i++)
  {
  	for(LL j=1;j<=len[i];j++)
  	{
  		printf("%.12f\n",st[i]);	
	}
  }
return 0;
}
 

 

在Python中,“单调栈接雨水”通常是一个经典的算法问题,源于一道面试题或编程比赛题目,它涉及到了数据结构中的栈操作和数组遍历。题目背景通常是这样的:给定一个高度不均匀的柱状图,每根柱子代表一个高度h[i]。下雨开始时,如果柱子顶部低于当前水位,那么雨会从顶部溢出,然后继续下落,直到水位再次高于柱子顶部。你的任务是在每次降雨之后,计算有多少雨水能够积累到每个柱子的底部。 这个问题的关键在于维护一个单调栈,当遇到比当前栈顶元素高的柱子时,就将这个高柱子压入栈中;当遇到比栈顶元素低的柱子时,则表示当前栈顶元素代表的是之前降雨中累积的高度,因此可以弹出栈顶元素并累计这部分雨水量。最后,剩余在栈中的柱子也都能积累雨水。 Python代码实现可能会这样: ```python def trap(height): if not height: return 0 stack = [] left, right = 0, len(height) - 1 water = 0 while left < right: # 当左指针处柱子高度小于等于栈顶柱子,把左指针处的雨水累积进结果 while stack and height[left] <= height[stack[-1]]: water += (height[stack.pop()] - height[left]) # 把左指针对应的柱子压入栈 stack.append(left) left += 1 # 当右指针处柱子高度大于等于栈顶柱子,把右指针处的雨水累积进结果 while stack and height[right] >= height[stack[-1]]: water += (height[right] - height[stack.pop()]) # 把右指针对应的柱子压入栈 stack.append(right) right -= 1 return water ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值