题目大意
有n条鱼,当一条鱼的体重至少是另一条的两倍时,体重更重的鱼会吃掉另一条。
把鱼两两一组装到入没有食物的鱼缸(如果鱼的数量是奇数则最后一个鱼缸内只有一条鱼), 请问要怎么分组最后鱼的总数最少,求出最后鱼的数量。
解题思路
排序后二分被吃掉的鱼的数量
每次取被吃掉的最大的和还能取得最大的分为一组(贪心),如果不行则往小了二分否则往大了二分
A c c e p t e d c o d e Accepted\ code Accepted code
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 5e5 + 5;
int n;
int a[N];
bool check(int x) {
int y = n;
for (int i = x; i >= 1; --i)
if (2 * a[i] > a[y--]) return 0;
return 1;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
int l = 1, r = n >> 1;
while (l <= r) {
int mid = l + r >> 1;
if (check(mid)) l = mid + 1;
else r = mid - 1;
}
printf("%d", n - r);
}