华东师范大学算法课ACM——框体排列

框体排列

单点限制:1.0sec
内存限制:512MB

数轴上有\(n\)个点,每个点有一个坐标 \(a_i\)。现在需要用数个宽度为\(k\) 的框体覆盖数轴上全部\(n\)个点,求出最少需要的框体数量。

输入格式

第一行两个整数\(n,k\),\((1≤n≤10^5,1≤k≤10^9)\),分别代表点的数量和框体宽度。

第二行\(n\)个整数,第\(i\)个整数\(a_i(1≤a_i≤10^9)\)代表第\(i\)个点在数轴上的坐标。

输出格式

一行一个整数,代表需要的最少框体数量。

样例1

输入:
4 1
1 2 3 4
输出:
2
解释:可以将两个框体分别放在[1,2]和[3,4]两个位置

样例2

输入:
4 3
1 2 3 4
输出:
1
解释:只需要将一个框体放在[1,4]

思路分析

代码实现

#include <iostream>
#include <algorithm>

using namespace std;

int binarySearchFirstMaxNumber(const int x[], int n, int ans) {
    int l = 0;
    int r = n - 1;
    int index = -1;
    while (l <= r) {
        int mid = (r - l) / 2 + l;
        if (x[mid] > ans) {
            index = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return index;
}

int getMinimumQuantityK(const int x[], int n, int k) {
    int count = 1;
    int i = 0;
    int ans = x[i] + k;
    while (i < n) {
        if (ans >= x[n - 1]) {
            break;
        }
        // find next
        i = binarySearchFirstMaxNumber(x, n, ans);
        ans = x[i] + k;
        count++;
    }
    return count;
}

int main() {
    int n, k;
    cin >> n >> k;
    int x[n];
    for (int i = 0; i < n; ++i) {
        cin >> x[i];
    }
    sort(x, x + n);
    cout << getMinimumQuantityK(x, n, k);
    return 0;
}

提交结果

image

posted @ 2022-09-26 21:52  aldalee  阅读(207)  评论(0)    收藏  举报