Luogu 10月30日提高团队赛 U138099 大鱼吃小鱼
Description–
小Q的家里养殖着一种肉食性的鱼,缺少食物的时候它们还会自相残杀,不过只有一条鱼的体重至少是另一条的两倍时,体重更重的鱼才能吃掉另一条。
小Q把鱼两两一组装到入没有食物的鱼缸(如果鱼的数量是奇数则最后一个鱼缸内只有一条鱼), 请问要怎么分组最后鱼的总数最少,求出此时鱼的数量。
Input–
第一行包含一个整数
n
n
n。
接下来
n
n
n 行,每行一个整数
s
i
s_i
si,表示第
i
i
i 条鱼的大小。
Output–
输出一个整数,即实验后鱼数量的最小值。
Sample Input–
样例1
8
2
5
7
6
9
8
4
2
样例2
5
1
2
3
4
5
样例3
3
2
2
1
Sample Output–
样例1
5
样例2
3
样例3
2
说明–
样例解释
假设有
8
8
8 条鱼体重分别是
2
,
5
,
7
,
6
,
9
,
8
,
4
,
2
{2,5,7,6,9,8,4,2}
2,5,7,6,9,8,4,2,那么当分组情况为
[
2
,
6
]
[
2
,
7
]
[
4
,
8
]
[
5
,
9
]
[2,6] [2,7] [4,8] [5,9]
[2,6][2,7][4,8][5,9]时,前三组大鱼都吃掉了小鱼,最后一组的两条鱼都活了下来,此时所剩鱼的数量最少,为
5
5
5 条
数据范围
对于
45
%
45\%
45% 的数据,
1
≤
N
≤
20
,
1
≤
s
i
≤
100
1≤N≤20,1≤si≤100
1≤N≤20,1≤si≤100
对于
65
%
65\%
65% 的数据,
1
≤
N
≤
1000
1≤N≤1000
1≤N≤1000
对于
100
%
100\%
100%的数据,
1
≤
N
≤
5
e
5
,
1
≤
s
i
≤
1
e
5
1≤N≤5e5,1≤si≤1e5
1≤N≤5e5,1≤si≤1e5
解题思路–
先排个序,然后把排好序的鱼从中间分成两份(若鱼的数量是奇数则把中间的那条单独放置
小的那份和大的那份依次比较,若大鱼可以把小鱼抹杀则减去一条鱼,否则换一条更大的鱼继续比较即可
代码–
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
int n, x, y, a[500005];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
x = 1, y = (n + 1) / 2 + 1;
while (y <= n)
{
if (2 * a[x] <= a[y]) x++;
y++;
}
printf("%d", n - x + 1);
return 0;
}