881. 救生艇
给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回 承载所有人所需的最小船数 。
示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
示例 2:
输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
示例 3:
输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)
解题代码如下:
void quick(int *a,int low,int high){
if(low<high){
int l=low,h=high,p=a[low];
while(low<high){
while(low<high&&a[high]>=p){
high--;
}
a[low]=a[high];
while(low<high&&a[low]<=p){
low++;
}
a[high]=a[low];
}
a[low]=p;
quick(a,l,low-1);
quick(a,low+1,h);
}
}
int numRescueBoats(int* people, int peopleSize, int limit){
quick(people,0,peopleSize-1);
int count=0;
int i;
int r[peopleSize];
for(i=peopleSize-1;i>=0;i--){
r[i]=1;
}
int l=0,h=peopleSize-1;
for(i=0;i<peopleSize;i++){
int val=people[i];
while(people[h]+val>limit){
h--;
if(h<=l){
break;
}
}
if(h<=l){
break;
}
r[h]=0;
r[l]=0;
count++;
l++;
h--;
}
for(i=0;i<peopleSize;i++){
// printf("%d ",r[i]);
if(r[i]==1){
count++;
}
}
return count;
}