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\n",r+1); 40 } 41 }
时间: 2024-12-04 17:28:10