概述
题意:有一个多重集合(元素可以重复的),初始为空,现有两种操作,1是往集合里添加一个数字x,x一定不小于集合里的任何一个数(这个很重要),2是问这个集合子集中的 max(s) - mean(s)中最大的是多少,max(s)是一个集合中最大的元素,mean(s)是集合的平均值。
思路:因为这个集合是从小到大往里面加数的,很显然答案是这个多重集合中的最大值加上最前面一些数的和,那么加到什么位置为止呢?有这么一句话:如果一个数小于一些数的平均数,那么加上这个数,平均数会变小(我自己编的)。那么显然就有这样一个关系,设前面那些数的和为sum,数量为cnt个,现在集合中有n个数,那么答案就是 a[n] - (sum + a[n] )/ (cnt+1),那么这个sum怎么算呢,根据前面的结论:sum中已经有cnt个数了,如果 a[cnt+1] < (sum + a[n]) / (cnt+1),就可以把a[cnt+1]加到sum里,直到a[cnt+1]不符合条件为止。
好了啰嗦了这么多,其实代码很简单。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
LL a[500010];
int main(void)
{
int q,i,j;
while(scanf("%d",&q)==1)
{
LL sum = 0;
int n = 0;
int cnt = 0;
while(q--)
{
int op,x;
scanf("%d",&op);
if(op == 1)
{
n++;
scanf("%d",&a[n]);
while(cnt < n && sum + a[n] > a[cnt+1]*(cnt+1))
{
cnt++;
sum += a[cnt];
}
}
else
{
double ans = a[n] - 1.0*(sum + a[n])/(cnt+1);
printf("%.6fn",ans);
}
}
}
return 0;
}
最后
以上就是过时微笑为你收集整理的Codeforces Round #464 (Div. 2) E. Maximize!的全部内容,希望文章能够帮你解决Codeforces Round #464 (Div. 2) E. Maximize!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复