---
# System prepended metadata

title: 演算法題 - 基地台 - APCS - by Peter Wang
tags: [Binary Search, APCS]

---

# 演算法題 - 基地台 - APCS - by Peter Wang
## 題目資訊
此題為2017.3.4 測驗中的題目4
###### tags: `APCS` `Binary Search`

## 題目敘述
![](https://i.imgur.com/IdJPaJG.png)


### 輸入：
輸入有兩行。第一行是兩個正整數 N 與 K，以一個空白間格。第二行 N 個非負整數P[0],P[1],....,P[N-1]表示 N 個服務點的位置，這些位置彼此之間以一個空白間格。請注意，這 N 個位置並不保證相異也未經過排序。本題中，K<N 且所有座標是整數，因此，所求最小直徑必然是不小於 1 的整數。

### 輸出：
輸出最小直徑，不要有任何多餘的字或空白並以換行結尾。

## 解題思路
用Binary Search的解題想法，搜尋最大半徑。

## Binary Search 介紹
請點選此連結觀看介紹。[二分搜](https://hackmd.io/@PeterWang/HyG22BNid)

## 程式碼
```clike=
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int k;
int y=1;
int arr1[50001];
bool is_cover(int x, int k){
  y = 1;
  for(int i=0;i<n;){
    while(arr1[i]+x>=arr1[y]){
      if (y == n-1) return true;
      y++;
    }
    k--;
    if(k == 0) return false;
    i=y;
  }
  return true;
}
int main(){
  while(cin>>n){
    cin>>k;
    for(int i=0;i<n;i++){
      cin>>arr1[i];
    }
    sort(arr1,arr1+n);
    int min = 1;
    int max = (arr1[n-1] - arr1[0]) / k + 1;
    while (min <= max) {
      int mid = (min + max)/2;
      if (is_cover(mid, k)){
        max = mid;
      } else {
        min = mid + 1;
      }
      if (min == max) break;
    }
    cout << min <<endl;
  }
}
```
## 資料來源
[zerojudge](https://zerojudge.tw/)
[題目敘述](https://zerojudge.tw/ShowProblem?problemid=c575)
[原題PDF檔](https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnx6c2dpdGl0aXR8Z3g6MTRmYzQ0ZTM0MzJjZTlhYQ)

## 備註
>[name=PeterWang]
>[time=Sun, Jun 13, 2021 11:35 PM]