- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
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
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"}">
评论记录:
回复评论: