此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接 :https://www.luogu.org/problem/show?pid=1824
题目描述
Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。
他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入输出格式
输入格式:
第1行:两个用空格隔开的数字N和C。
第2~N+1行:每行一个整数,表示每个隔间的坐标。
输出格式:
输出只有一行,即相邻两头牛最大的最近距离。
输入输出样例
输入样例#1:
5 3 1 2 8 4 9
输出样例#1:
3 分析:对最大的最近距离进行二分,判断能否符合要求。大概算是二分答案的裸题? AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<iostream> 5 6 using namespace std; 7 int l = 21474836,r,n,c; 8 int num[100005]; 9 10 int cmp(int a,int b) 11 {return a < b;} 12 13 inline void read(int &x) 14 { 15 char ch = getchar(),c = ch;x = 0; 16 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 17 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 18 if(c == ‘-‘) x = -x; 19 } 20 21 bool jud(int x) 22 { 23 int cnt = 1,tmp = num[1]; 24 for(int i = 2;i <= n;++ i) 25 { 26 if(num[i] - tmp >= x) 27 cnt ++,tmp = num[i]; 28 if(cnt >= c) return true; 29 } 30 return false; 31 } 32 33 int main() 34 { 35 read(n),read(c); 36 for(int i = 1;i <= n;++ i) 37 { 38 read(num[i]); 39 if(num[i] > r) r = num[i]; 40 if(num[i] < l) l = num[i]; 41 } 42 sort(num+1,num+1+n,cmp); 43 while(l+1 < r) 44 { 45 int mid = ((l+r)>>1); 46 if(jud(mid)) l = mid; 47 else r = mid; 48 } 49 printf("%d\n",l); 50 return 0; 51 }
时间: 2024-11-10 15:55:11