题目来源:http://codeforces.com/problemset/problem/253/B
题意:给定一个序列,问删除最少的数,使得剩下的数中的最小值x和最小值y
使得y<=2*x;
思路:二分查找啊。。。先排序,然后枚举每个数num[i],并以num[i]作为新序列的第一个
元素,计算可以构成的序列的长度;然后用n减去新序列的长度就是需要删除的数量了;
感慨:又只过了一题啊,rating掉到谷底了啊,尼玛啊。。第二题稍微想了下就乱搞啊,
而且还是错误的方法。。真心SB啊。。用这篇博客记录再次被虐的一天。。。
//author Joy
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
#define arrSize 100100
#define strSize 10100
#define gridSize 510
using namespace std;
const int MAXINF=1000000;
const int MININF=-1000000;
/*---------------分割线---------------*/
int bs(int a[], int l, int h, int v)
{
int m;
while ( l < h )
{
m = ( l + h ) >> 1;
if (a[m] < v) l=m+1;
else h=m;
}
return l;
}
int num[arrSize];
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n;
while (~scanf("%d",&n))
{
int i,res=MAXINF;
for (i=0;i<n;i++)
scanf("%d",&num[i]);
sort(num,num+n);
for (i=0;i<n;i++)
{
int p=bs(num,i,n-1,num[i]*2);
int q=p;
//往上找
while(p<=n-1&&num[i]*2>=num[p])
p++;
if (n-p+i<res)
res=n-p+i;
//往下找
while(q>i&&num[i]*2<num[q])
q--;
if (n-q+i<res)
res=n-q+i;
}
printf("%d\n",res);
}
return 0;
}