思路 :
- 如果将新的(也就是最大的)数放入s集合,为了平均值尽可能小,…
- 注意这里不需要去思考是不是每次要放入最大的数,直接取max即可
- 这道题主要要注意的就是指针的写法,
k + 1
,也就是取下一位是否满足条件,k一开始取0,数组下标从1开始
#include <iostream>
#define endl '\n'
#define _(a) cout << #a << ": " << (a) << " "
using namespace std;
const int N = 5e5 + 10;
double a[N];
int n;
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int q;
cin >> q;
int op, x;
int k = 0;
double sum = 0;
double mx = 0;
while (q -- ) {
cin >> op;
if (op == 1) {
cin >> x;
a[ ++ n] = x;
while (k + 1 <= n && a[k + 1] <= (sum + a[n]) / (k + 1)) {
sum += a[ ++ k];
}
mx = max(mx, a[n] - (sum + a[n]) / (k + 1));
} else {
printf("%.6lf\n", mx);
}
}
}