题目详情:小明做实验,统计n个实验数据,要求数据最大值(max)不能大于最小值(min)的二倍;问为满足要求最少要从实验数据中删除几个(数据要由input.txt读入;写入output.txt)
- 先排序
- 从1到n循环二分
详见链接:文件输入输出
函数名:freopen
声明:FILE *freopen( const char *path, const char *mode, FILE *stream );
所在文件: stdio.h
参数说明:
path: 文件名,用于存储输入输出的自定义文件名。
mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。
stream: 一个文件,通常使用标准流文件。
返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。freopen("input.txt",'r',stdin);//文件名,读入,标准输入流
freopen("output.txt",'w',stdout);//文件名,写入,标准输出流
/*二分是为了查找一组数的边界,外层的循环让这组数的边界也不断变化*/
for(int i=1;i<=n;i++){
int l=i,r=n;
while(l<r){
int mid=l+r+1>>1;
if(check(mid,i)) l= mid;
else r=mid-1;
}
}
白嫖的代码:
#include<iostream>
#include<queue>
#include<algorithm>
#include<string>
#include<cstring>
#define IOS ios::sync_with_stdio(false); cin.tie(0);
using namespace std;
const int N=1e5+10;
const int M=150;
const int INF=0x3f3f3f3f;
const int MOD=998244353;
int a[N];
bool check(int mid,int start){
if(a[start]*2>=a[mid]) return true;
return false;
}
void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int ans=INF; //INF为16进制最大值
for(int i=1;i<=n;i++){
int l=i,r=n;
while(l<r){
int mid=l+r+1>>1;
if(check(mid,i)) l=mid;
else r=mid-1;
}
ans=min(ans,n-l+i-1);
}
cout<<ans<<endl;
}
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
IOS;
solve();
return 0;
}