AtCoder Grand Contest 011: B - Colorful Creatures
solution
sortしてしゃくとりっぽい貪欲。$O(N)$。
生き物$l$が食べられる最大の大きさの生き物$r$をそれぞれについて求めればよい。 これは$A_{l_1} \le A_{l_2}$ならば$A_{r_1} \le A_{r_2}$なので、数列$A$をsortして$l$を増やしながら$r$も増やしていくことで効率よく求まる。
implementation
#include <iostream>
#include <vector>
#include <algorithm>
#define repeat(i,n) for (int i = 0; (i) < int(n); ++(i))
#define whole(f,x,...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x)
using ll = long long;
using namespace std;
int main() {
int n; cin >> n;
vector<int> a(n); repeat (i,n) cin >> a[i];
whole(sort, a);
ll acc = 0;
int l = 0, r = 0;
while (true) {
if (r == l) {
acc += a[l];
++ r;
}
while (r < n and a[r] <= 2*acc) {
acc += a[r];
++ r;
}
if (r == n) break;
++ l;
}
cout << r - l << endl;
return 0;
}