有了之前一题的经验,这道题明显写起来更加得心应手了,具体思路和上一题非常像,这里只做一个小小的改动就可以
对了 题目翻译如下·:
有n个牛棚 c头牛,这些牛之间会相互打架,为了避免这种情况,我们需要让牛之间的距离尽可能的(住在不同的牛棚,可能几头牛之间空出几个牛棚),输入数据 先输入n c 之后输入 n个 牛棚坐标,输出最大的可行距离。
具体代码在下方,建议先自己思考一下 僵化了再看。。和上一道题思路非常类似可以先想一下最暴力的思路,然后想办法去其中优化
提示:搜索可以用二分优化。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1e7+5; int n,c; int loc[maxn]; bool judge(int x) { int sum=0; int len=1; for(int i=2;i<=n;i++) { if(sum+loc[i]-loc[i-1]<x) { sum+=loc[i]-loc[i-1]; } else { sum=0; len++; } } return len>=c; } int main() { while(cin>>n>>c) { for(int i=1;i<=n;i++) { cin>>loc[i]; } sort(loc+1,loc+1+n); int l,r=loc[n]-loc[1],m; l=r; for(int i=2;i<=n;i++) { l=min(l,loc[i]-loc[i-1]); } while(l<=r) { m=(l+r)>>1; if(judge(m)) { l=m+1; } else { r=m-1; } } cout<<r<<endl; } return 0; }