# Physics Practical

One day Vasya was on a physics practical, performing the task on measuring the capacitance. He followed the teacher's advice and did as much as n measurements, and recorded the results in the notebook. After that he was about to show the results to the teacher, but he remembered that at the last lesson, the teacher had made his friend Petya redo the experiment because the largest and the smallest results differed by more than two times. Vasya is lazy, and he does not want to redo the experiment. He wants to do the task and go home play computer games. So he decided to cheat: before Vasya shows the measurements to the teacher, he will erase some of them, so as to make the largest and the smallest results of the remaining measurements differ in no more than two times. In other words, if the remaining measurements have the smallest result x, and the largest result y, then the inequality y ≤ 2·x must fulfill. Of course, to avoid the teacher's suspicion, Vasya wants to remove as few measurement results as possible from his notes.

Help Vasya, find what minimum number of measurement results he will have to erase from his notes so that the largest and the smallest of the remaining results of the measurements differed in no more than two times.

先对给出的序列按升序排序，i从左到右枚举序列最小值，假设他是最小值时，需要删除的数的个数i-1+n-j+1.

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<math.h>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
const int inf=1000000;
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,a[200005],i,minn,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
minn=inf;
j=1;
for(i=1;i<=n;i++)
{
while(j<=n&&a[j]<=2*a[i])
{
j++;
}
minn=min(minn,i+n-j);
}
printf("%d\n",minn);
}


• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120