I

 1 /*
 2 屋顶有n个洞,用k块板子覆盖所有洞,问最长的一块板子至少是多长。
 3 二分长度,贪心的方式尝试覆盖,把每一块板子都放在刚好能覆盖最左边的洞的最右位置
 4 从而判断某个长度的k块板子能否覆盖所有洞。
 5 */
 6 #include <bits/stdc++.h>
 7 using namespace std;
 8 int d[100010];
 9 int main()
10 {
11     int t;
12     scanf("%d",&t);
13     while(t--)
14     {
15         int n,m;
16         scanf("%d%d",&n,&m);
17         for(int i=0;i<n;i++)
18             scanf("%d",&d[i]);
19         int l=0;
20         int r=d[n-1]/m+1;
21         while(l<=r)
22         {
23             int mid=l+(r-l)/2;
24             int x=d[0];
25             int cnt=1;
26             for(int i=1;i<n;i++)
27             {
28                 if(d[i]>=x+mid)
29                 {
30                     x=d[i];
31                     cnt++;
32                 }
33             }
34             if(cnt>m)
35                 l=mid+1;
36             else
37                 r=mid-1;
38         }
39         printf("%d
",r+1);
40     }
41 }
原文地址:https://www.cnblogs.com/kearon/p/7215289.html