题目链接:传送门
题意:给一个序列,可以选择两个数合并,要求这两个数大的是小的数的2倍或者以上,求合并完后的序列数的个数,要求最少,并且已经合并的数不能再和其他数合并
贪心法,给n个数,排序,则最少的结果是n/2,则i从1开始贪心到n/2,x从n/2开始到n,每次出现ax是ai的两倍,则x和i都加一,让其合并,如果不是则x加一,知道x到达n
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 500100
int a[N],vis[N];
int main(){
int i,m,n,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
int res=n,x;
memset(vis,0,sizeof(vis));
x=n/2+1;
for(i=1;i<=n/2&&x<=n;){
if(a[i]*2<=a[x]) {res--;x++;i++;}
else x++;
}
cout<<res<<endl;
return 0;
}