链接
题目描述
现在有n个数,当一个数至少是另一个数的两倍时,大的数可以消除掉小的数,现在要把这n个数两两分组,求最少可以剩余几个数
思路
贪心,大的分一块,小的分一块,直接匹配就好了
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n, a[1000005], ans;
bool cmp(int x, int y)
{
return x > y;
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
sort(a + 1, a + n + 1, cmp);
int mid = n / 2;
ans = n;
for(int i = 1; i <= n / 2 && mid <= n; ++i)
{
while(a[i] < 2 * a[mid]) mid++;
if(mid > n) break;
if(a[i] >= 2 * a[mid]) ans--, mid++;
}
printf("%d", ans);
return 0;
}