分治

分解為小問題 合併結果

分治

/*
 * AP325
 * P-1-3. 棍子中點切割
*/
#include <bits/stdc++.h>
using namespace std;

int cut(vector<long long int>& a, int l, int r) {
	if (r - l <= 1) return 0;
	int len = a[r]-a[l] , k = (a[l]+a[r])/2;
	int m = (l + r)/2;
	while (a[m]<k){
		m++;
	}
    if (a[m-1]-a[l] >= a[r]-a[m]){
        m--; 
    }
    return (len) + cut(a, l, m) + cut(a, m, r);
}

int main() {
    int N, L;
    cin >> N >> L;
    vector<long long int> a(N + 2);
    a[0] = 0;
    for (int i = 1; i <= N; i++) {
        cin >> a[i];
    }
    a[N + 1] = L;
    cout << cut(a, 0, N + 1) << endl;
    return 0;
}

Last updated

Was this helpful?