C解法

首先,对所有人的体重进行排序。排序后,我们可以利用双指针方法,高效地将最轻和最重的人配对,尽量减少车的数量。
双指针策略:

使用两个指针,l 指向体重最轻的人,r 指向体重最重的人。
每次检查 nums[l] + nums[r] 是否小于或等于 lim,即是否可以将 l 和 r 指向的两个人放在同一辆车上:
如果可以,将这两个人放在同一辆车上,并且分别移动两个指针(l++,r–)。
如果不可以,则只能将最重的人单独分配一辆车,移动 r–。
继续执行这个过程,直到所有人都分配到车上。
结束条件:

当 l 和 r 重合时,说明只剩一个人,该人单独一辆车。
最终返回:

返回分配的车数。
时间复杂度:
排序的时间复杂度是 O(n log n),双指针扫描的时间复杂度是 O(n)。因此,总的时间复杂度是 O(n log n)。

#include 
#include 

// 比较函数,用于qsort排序
int compare(const void* a, const void* b) {
    return (*(int*)a - *(int*)b); // 按照升序排序
}

// 计算最少车数的函数
int calcRes(int* nums, int size, int lim) {
    // 对体重数组进行排序
    qsort(nums, size, sizeof(int), compare);

    int cnt = 0; // 记录车数
    int l = 0;   // 左指针,指向最轻的人
    int r = size - 1; // 右指针,指向最重的人

    // 使用双指针算法进行分配
    while (l < r) {
        // 如果最轻的人和最重的人可以一起坐一辆车
        if (nums[l] + nums[r] <= lim) {
            l++; // 最轻的人分配一辆车,左指针右移
        }
        // 最重的人一定需要一辆车,右指针左移
        r--;
        cnt++; // 增加一辆车
    }

    // 如果左指针和右指针重合,说明还有一个人未分配
    if (l == r) cnt++;

    return cnt; // 返回最少车数
}

int main() {
    int lim, sz;
    scanf("%d %d", &lim, &sz); // 输入最大承载重量和人数

    int nums[sz]; // 定义一个数组来存储体重
    for (int i = 0; i < sz; i++) {
        scanf("%d", &nums[i]); // 输入每个人的体重
    }

    printf("%d\n", calcRes(nums, sz, lim)); // 输出最少车数

    return 0;
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144514350"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!