0
点赞
收藏
分享

微信扫一扫

codeforces #373 C.Counting Kangaroos is Fun

穆熙沐 2022-07-15 阅读 95


题目链接:​​传送门​​​
题意:给一个序列,可以选择两个数合并,要求这两个数大的是小的数的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;
}


举报

相关推荐

0 条评论