白準2110:ルータをインストールする


https://www.acmicpc.net/problem/2110

1.近接

  • 街の範囲は1~(1軒目と最後の家の距離)です.
  • 正しい答えをすばやく見つけるために、バイナリ検索を使用します.
  • の最初の家が固定されている場合、多くの場合、答えが見つかります.
    (注:https://www.acmicpc.net/board/view/50802)
  • 第1家と第i家の距離がmidと一致すると、第i家と第2家の距離
  • に移る.

    2.私の回答

    #include <iostream>
    #include <algorithm>
    #define MAX 200001
    using namespace std;
    
    int main() {
    	int n, c;
    	cin >> n >> c;
    	int house[MAX];
    
    	for (int i = 0; i < n; i++) {
    		cin >> house[i];
    	}
    	sort(house, house + n);
    
    	int start=1, end=(house[n-1]-house[0]), mid;
    	int ret = 0; //최소거리의 최댓값
    
    	while (start <= end) {
    		mid = (start + end) / 2;
    			
    		int prev = house[0];
    		int tem = 1;
    		for (int i = 1; i < n; i++) {
    			if (house[i] - prev >= mid) {
    				tem++;
    				prev = house[i];
    			}
    		}
    
    		if (tem >= c) {
    			ret = max(ret, mid);
    			start = mid + 1;
    		}
    		else end = mid - 1;
    	}
    
    	cout << ret << "\n";
    	return 0;
    }

    3.参考


    https://mygumi.tistory.com/301
    http://melonicedlatte.com/algorithm/2018/07/29/132129.html