洛谷P1316 P1824

P1316 丢瓶盖

题目描述

陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?

输入输出格式

输入格式:

第一行,两个整数,A,B。(B<=A<=100000)

第二行,A个整数,分别为这A个瓶盖坐标。

输出格式:

仅一个整数,为所求答案。

输入输出样例

输入样例#1:
5 3
1 2 3 4 5
输出样例#1:
2

说明

限时3秒

P1824 进击的奶牛

题目描述

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

【题解】

二分答案

从第一个开始贪心放即可,证明显然

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 
 7 inline void read(int &x)
 8 {
 9     x = 0;char ch = getchar(), c = ch;
10     while(ch < '0' || ch > '9')c = ch, ch = getchar();
11     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
12     if(c == '-')x = -x;
13 }
14 
15 const int MAXN = 100000 + 10;
16 
17 int n,num[MAXN],m,ans;
18 
19 bool check(int k)
20 {
21     int pre = 1, cnt = 1;
22     for(register int i = 2;i <= n;++ i)
23         if(num[i] - num[pre] >= k)++ cnt, pre = i;
24     if(cnt >= m)return 1;
25     return 0;
26 }
27 
28 int main()
29 {
30     freopen("data.txt", "r", stdin);
31     read(n);read(m);
32     for(register int i = 1;i <= n;++ i)
33         read(num[i]);
34     std::sort(num + 1, num + 1 + n); 
35     register int l = 1, r = num[n] - num[1],mid;
36     while(l <= r)
37     {
38         mid = (l + r) >> 1;
39         if(check(mid))l = mid + 1, ans = mid;
40         else r = mid - 1;
41     }
42     printf("%d", ans);
43     return 0;
44 }
洛谷P1316 P1824
原文地址:https://www.cnblogs.com/huibixiaoxing/p/7470269.html