题目地址:戳这里
思路:先排序
然后对每一个当前的p[i],用logn的方法 对每一个找到2*p[i] 的 upper_bound
用贪心的思想知道,肯定是去头去尾,不会去中间的。
算法复杂度: nlogn
注意一定是文件输入输出
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<fstream>
using namespace std;
int p[1000005];
int main()
{
//
ifstream cin("input.txt");
ofstream cout("output.txt");
int n;
cin>>n;
//
// for(int i=0;i<n;i++)
// scanf("%d",&p[i]);
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n);
int maxi=-1;
for(int i=0;i<n;i++)
{
// if(2*p[i]>p[n-1]) break;
int l=0,r=n;
int m;
while(l<r)
{
m=l+(r-l)/2;
if(2*p[i]>=p[m]) l=m+1;
else r=m;
}
if(l-i>maxi) maxi=l-i;
}
cout<<n-maxi<<endl;
return 0;
}
直接用stl 更快捷
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<fstream>
using namespace std;
int p[1000005];
int main()
{
ifstream cin("input.txt");
ofstream cout("output.txt");
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n);
int maxi=-1;
for(int i=0;i<n;i++)
if(upper_bound(p,p+n,2*p[i])-(p+i)>maxi)
{
maxi=upper_bound(p,p+n,2*p[i])-(p+i);
}
cout<<n-maxi<<endl;
}