//检查是否可按最小距离放置C头牛 boolcheck(int mid){ int count = 1; //已放置的牛数 int last = arr[0]; //上一头牛的位置 for (int i = 1; i < N; i++) { if (arr[i] - last >= mid) { count++; last = arr[i]; if (count == C) return1; } } return0; }
//求最大最小距离 intBS(){ int l = 1; //最小可能距离 int r = arr[N - 1] - arr[0]; //最大可能距离 int ans = 0; while(l <= r) { int mid = (l + r) / 2; if (check(mid)) { ans = mid; l = mid + 1; //尝试更大的最小距离 } else { r = mid - 1; //尝试更小的最大距离 } } return ans; }
intmain() { cin >> N >> C; for (int i = 0; i < N; i++) { scanf("%d", &arr[i]); } sort(arr, arr + N); cout << BS() << endl;
//检测是否可以移走所有距离小于最短跳跃距离的石头 boolcheck(int d){ int pre = 0;//上一个未移除的石头的位置 int count = 0; //这里不能直接遍历整个数组,因为可能会移除终点处的石头 for (int i = 1; i <= N; i++) { if (arr[i] - pre < d) { count++; } else { pre = arr[i]; //更新上一个未移除的石头位置 } } if (arr[N + 1] - pre < d) count++; return count <= M; }
//找到最大最小距离 intBS(){ int l = 1; int r = L; int ans = 0; while (l <= r) { int mid = (l + r) / 2; if (check(mid)) { ans = mid; l = mid + 1; } else { r = mid - 1; } } return ans; }
intmain() { cin >> L >> N >> M; for (int i = 1; i <= N; i++) { scanf("%d", &arr[i]); } arr[0] = 0; arr[N + 1] = L; cout << BS() << endl; return0; }