题目
分析
- 先只考虑偶数,奇数直接+1就好啦
- 我们很容易就想到贪心来找,但是又发现不好确定决策最优性,所以我们就得放弃了。
- 那么贪心不行,DP可以吗?好像不大行,后效性比较明显。
反正我不会 - 那就考虑爆搜吧,搜着搜着我们发现,显然我们最优答案的话是一种
按
大
小
升
序
排
列
,
前
面
一
半
一
组
,
后
面
一
半
一
组
,
一
一
对
应
的
吃
掉
按大小升序排列,前面一半一组,后面一半一组,一一对应的吃掉
按大小升序排列,前面一半一组,后面一半一组,一一对应的吃掉
这个引入希望你们能看懂 - 那么你没有想错,这个就是正解了。
- 我不会写严谨的数学证明,例如反证法什么的,你们可以手玩几组小样例。
- 然后就会强烈感到 一一对应 的重要性了。
附言
因为赛场上写了个比std更好的所以才写了博客
代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n;
int f[N];
int a[N],b[N];
inline int read()
{
int num=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9') {num=(num<<1)+(num<<3)+ch-'0'; ch=getchar();}
return num*f;
}
int main()
{
freopen("decrease.in","r",stdin);
freopen("decrease.out","w",stdout);
n=read();
for(int i=1;i<=n;i++) f[i]=read();
sort(f+1,f+1+n);
int Bit=n/2,top=1,t=0;
for(int i=Bit+1;i<=n;i++)
{
if(top>Bit) break;
if(f[top]*2<=f[i]) t++,top++;
}
printf("%d",n-t);
return 0;
}