|
思路:
首先对所有位置排序一下。 可能的最大的 distance 为 (range_right - range_left) / (C - 1)。 所以二分答案的时候区间的右边就是这个了。 判断某个 distance 是否能够成立的过程很简单: 只需要从左往右放牛,如果放到最后一个点都放不完,就不成立了。
代码 140ms:
#include <stdio.h>
#include <stdlib.h>

int N, C, in[100032];

int cmp(const void *a, const void *b)
  {
return *(int *)a - *(int *)b;
}

__inline int can(int val)
  {
int i, pos, sum;

pos = 1;
 for (i = 1; i < C; i++) {
sum = 0;
 while (pos < N && sum < val) {
sum += in[pos] - in[pos - 1];
pos++;
}
if (sum < val)
return 0;
}
return 1;
}

int main()
  {
int i, l, r, m;

freopen("e:\\test\\in.txt", "r", stdin);

scanf("%d%d", &N, &C);
for (i = 0; i < N; i++)
scanf("%d", &in[i]);
qsort(in, N, sizeof(in[0]), cmp);

l = 0;
r = (in[N - 1] - in[0]) / (C - 1);
 while (l <= r) {
m = (l + r) / 2;
if (can(m))
l = m + 1;
else
r = m - 1;
}
printf("%d\n", r);

return 0;
}

|