学OI一年的站外题求助 (悬关)
  • 板块学术版
  • 楼主STAR_shine
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/4/2 15:04
  • 上次更新2023/10/23 19:38:30
查看原帖
学OI一年的站外题求助 (悬关)
597761
STAR_shine楼主2023/4/2 15:04

题目:

题目描述
农夫 John 建造了一座很长的畜栏,它包括N(2≤N≤100,000)N个隔间,这些小隔间依次编号为x1,...,xN(0≤xi≤1,000,000,000). 但是,John的C(2≤C≤N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里或隔间距离较近,他们就容易发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?
输入
第一行:空格分隔的两个整数N和C;
第二行:  第N+1行:i+1行指出了xi的位置,表示畜栏隔间位置。
输出
一个整数,最大的最小值。
样例输入 Copy
5 3
1 2 8 4 9
样例输出 Copy
3
提示
把牛放在1,4,8这样最小距离是3。

我的10分代码:

#include<bits/stdc++.h>
using namespace std; 
int n,m,ans,sum,ans2,a[100005],r,l=1e9;
bool yhg(int x){
	int t=0,ztl=1;
	for(int i=1;i<=n;i+=ztl){
		if(a[i]+x<=a[i+ztl]){
			t++;
			ztl=1;
		}
		else ztl++;
	}
	if(t>=m-1) return 1;
	else return 0;
} 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",a+i);	
	sort(a+1,a+n+1);
	for(int i=1;i<n;i++){
		r=max(r,a[i+1]-a[i]);
		l=min(l,a[i+1]-a[i]);
	}
	while(l<=r){
		int mid=(l+r)/2;
		if(yhg(mid)){
			ans=mid;
			l=mid+1;
		}
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}

求大佬帮助,谢谢!

2023/4/2 15:04
加载中...