2021-9-26 洛谷模拟赛 T3 大鱼吃小鱼
题目大意
给你 n 个数,选一些数两两匹配,但条件是大的数至少是小的数的两倍。
然后如果有数没有匹配,则自己视为一对,否则一对匹配算一对。
然后要你最小化对数
__ By TJH
思路:
显然贪心
首先从小到大排序,将区间划分为
[
1
,
n
2
]
[1,\frac{n}{2}]
[1,2n] 和
[
n
2
+
1
,
n
]
[\frac{n}{2}+1,n]
[2n+1,n],两段。从左往右贪心选数匹配
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
#include<cmath>
#include<ctime>
#define r register
#define rep(i,x,y) for(r ll i=x;i<=y;++i)
#define per(i,x,y) for(r ll i=x;i>=y;--i)
using namespace std;
typedef long long ll;
const ll V=5e5+10,p=1e9+7;
ll n,a[V],ans;
bool used[V];
inline ll in()
{
ll res=0,f=1;
char ch;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-') f=-1;
res=res*10+ch-48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-48;
return res*f;
}
void put(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) put(x/10);
putchar(x%10+48);
}
int main()
{
n=in();
ans=n;
rep(i,1,n) a[i]=in();
sort(a+1,a+n+1);
ll i=1,j=(n>>1)+1;
for(i=1,j=(n+1)>>1;i<=(n>>1)&&j<=n;++i,++j)
{
while((a[i]<<1)>a[j]&&j<=n) ++j;
if(j<=n) --ans;
}
cout<<ans;
return 0;
}