习题: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! (贪心)的主要内容,如果未能解决你的问题,请参考以下文章