思路:
先排序,然后考虑把序列砍成两段,然后左边的去和右边的匹配。
为什么是最优的呢,显然最后匹配下来左边的剩下的无论怎么匹配都不能被吃。所以右边的如果还有剩就自己匹配一下。
c o d e code code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, ans;
int a[500010];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
if(n % 2 == 1) a[++ n] = 1e9;
sort(a + 1, a + 1 + n);
int i = 1, j = n / 2 + 1;
for(; i <= n / 2 && j <= n; ) {
if(a[i] * 2 <= a[j]) ans ++, i ++, j ++;
else j ++;
}
while(j <= n) {
if(j + 1 <= n) {
if(a[j] * 2 <= a[j + 1]) ans ++;
j ++;
}
j ++;
}
printf("%d", n - ans);
return 0;
}