习题:Maximize! (贪心)

Posted loney-s

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题:Maximize! (贪心)相关的知识,希望对你有一定的参考价值。

题目

传送门

思路

假设我们现在已经有了这个子集的总和为s,个数为siz,最大值为maxx

注意到一个性质

如果(a_ile frac{s}{siz}),那么(a_i)这个元素一定在子集之内

换言之,选的数是连续的

考虑新加入一个元素(x),这时最大值发生改变

原来的答案为(maxx-frac{s}{siz})

现在的答案为(x-frac{s-maxx+x}{siz})

两式相减可以发现新的答案一定更优

所以子集的最大值一定是整个集合的最大值

代码

#include<iostream>
using namespace std;
int q;
int opt;
int a[1000005];
int lena;
long long s;
int siz;
double basic=1;
int main()
{
    //ios::sync_with_stdio(false);
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d",&opt);
        if(opt==1)
        {
            lena++;
            scanf("%lld",&a[lena]);
            if(lena==1)
            {
                s=a[lena];
                siz=1;
                continue;
            }
            s-=a[lena-1];
            s+=a[lena];
            for(int j=siz;j<=lena;j++)
            {
                if(s>=1ll*a[j]*siz)
                {
                    s+=a[j];
                    siz++; 
                }
                else
                    break;
            }
        }
        else
        {
            if(lena==0)
                printf("%.10lf
",0*basic);
            else
                printf("%.10lf
",a[lena]-basic*s/siz);
        }
    }
    return 0;
}

以上是关于习题:Maximize! (贪心)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 939E - Maximize!

习题:专业网络(贪心)

贪心(qwq)习题题解

习题—动态规划贪心算法

2021算法竞赛入门班第一节课枚举贪心习题

习题:疫情控制(二分+倍增+贪心)