围栏高度的题解

奶牛们对围栏的高度非常敏感。奶牛希望围栏高度既不太矮以至于他们没有安全感,也不太高以至于她们看不见围栏外的天地。所以每头奶牛都有自己喜欢的高度。奶牛有 N 头,每个奶牛有一个自己喜欢的高度在[1…10,000]范围里。
这对 John 来说是一个头疼的问题。作为一个美学观点强烈的人,他希望围栏的高度基本相同,但作为一个有同情心的人,他希望能尽可能的满足奶牛们的需求。
(或许他只是一个自私的人,希望奶牛能给他多产点奶)
作为妥协,他决定将围栏的柱子做成不同的高度以满足大多数奶牛的需求(必须严格超过半数)。一个满意的条件是在所有的柱子中有它喜欢的那个高度。
但同时 John 希望最高的柱子和最矮的柱子之间的高度差最小。请你帮他解决这个问题。
围栏的高度仅仅由柱子的高度决定。

我的做法是二分

#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
	T RR=1;FF=0;char CH=getchar();
	for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
	for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
	FF*=RR;
}
template<typename T>void write(T x){
	if(x<0)putchar('-'),x*=-1;
	if(x>9)write(x/10);
	putchar(x%10+48);
}
const int MAXN=1e4+10;
int n,a[MAXN];
bool check(int x){
	int l=1;
	for(int i=1;i<=n;i++){
		int m=a[i]-x;
		while(a[l]<m)l++;
		if((i-l+1)*2>n)return true;
	}return false;
}
int main(){
	read(n);
	for(int i=1;i<=n;i++)read(a[i]);
	sort(a+1,a+n+1);
	int l,r=MAXN;
	while(l+1<r){
		int mid=(l+r)>>1;
		if(check(mid))r=mid;
		else l=mid;
	}cout<<r;
	return 0;
}
发布了70 篇原创文章 · 获赞 127 · 访问量 3933

猜你喜欢

转载自blog.csdn.net/qq_46230164/article/details/105384828