>Link
luogu U138099
>Description
小Q的家里养殖着一种肉食性的鱼,缺少食物的时候它们还会自相残杀,不过只有一条鱼的体重至少是另一条的两倍 时,体重更重的鱼才能吃掉另一条。
小Q想做一个实验,他把鱼两两一组装到入没有食物的鱼缸(如果鱼的数量是奇数则最后一个鱼缸内只有一条鱼), 请问要怎么分组最后鱼的总数最少,求出此时鱼的数量。
对于100%的数据,1≤N≤5e5,1≤si≤1e5
>解题思路
麻了,比赛的时候打了两个贪心发现都是错的,然后我把两个贪心放在一起取最小值输出竟然还可以坑80分QAQ
先排个序
发现最优的状态下就是把鱼平分成左右两部分,一一对应大的吃掉小的
所以我们搞两个指针,一个指左边小的鱼,一个指右边大的鱼,如果可以吃就吃掉,不可以的话右边的指针就往后跳
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 500010
using namespace std;
int n, a[N], p1, p2, ans;
int main()
{
scanf ("%d", &n);
ans = n;
for (int i = 1; i <= n; i++) scanf ("%d", &a[i]);
sort (a + 1, a + 1 + n);
p1 = 1, p2 = n / 2 + 1;
if (n & 1) p2++;
while (p1 <= n / 2 && p2 <= n)
{
if (a[p1] * 2 <= a[p2]) ans--, p1++, p2++;
else p2++;
}
printf ("%d", ans);
return 0;
}