题意:有一个多重集合(元素可以重复的),初始为空,现有两种操作,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]不符合条件为止。
好了啰嗦了这么多,其实代码很简单。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复