洛谷 P1824 进击的奶牛 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1824 进击的奶牛 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接 :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 }

 

以上是关于洛谷 P1824 进击的奶牛 题解的主要内容,如果未能解决你的问题,请参考以下文章

P1824 进击的奶牛

P1824 进击的奶牛(二分)

luogu P1824 进击的奶牛

洛谷1578:[WC2002]奶牛浴场——题解

洛谷 P2341 [HAOI2006]受欢迎的牛 题解

洛谷P2853 [USACO06DEC]Cow Picnic S 题解