CF1299C——Water Balance(思维 or 单调栈)

思维水题:
大致思路:
首先我们认为当前一个数大于后面一组数的平均数时
那么显而易见可以将这个数值得加入后面这一组数

从前向后遍历,假如前一个数 x 大于后一个数 y
那么从y开始向前遍历,如果前面的数值得加入这一组数,那么加入这一组数,继续向前
反之则直接结束。
也就是类似单调栈的操作

code:

#include<bits/stdc++.h>
#define ll long long;
using namespace std;
const int N=1e6+10;
double a[N],b[N];
int c[N],so=0;
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%lf",&a[i]);
    }
    for(int i=1;i<=n;i++)
    {
        b[++so]=a[i];
        c[so]=1;
        while(so>1&&b[so]<b[so-1])
        {
            b[so-1]=(b[so-1]*c[so-1]+b[so]*c[so])/(c[so-1]+c[so]);
            c[so-1] += c[so];
            so--;
        }
    }
    for(int i=1;i<=so;i++)
    {
        for(int j=1;j<=c[i];j++)
        {
            printf("%.15lf\n",b[i]);
        }
    }
}
发布了38 篇原创文章 · 获赞 1 · 访问量 776
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览