列表

详情


CMB25. 漂流船问题

描述

公司组织团建活动,到某漂流圣地漂流,现有如下情况:
员工各自体重不一,第 i 个人的体重为 people[i],每艘漂流船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
为节省开支,麻烦帮忙计算出载到每一个人所需的最小船只数(保证每个人都能被船载)。

输入描述

第一行输入参与漂流的人员对应的体重数组,

第二行输入漂流船承载的最大重量

输出描述

所需最小船只数

示例1

输入:

1 2
3

输出:

1

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2020-07-23

/*
把体重先排序并默认一个人一条船;从最轻的人开始,找一个剩下最重的人拼船,找到了船就减一,
没找到那后面更重的人也不可能找到了伙伴了直接break;
*/
#include <stdio.h>
#include <stdlib.h>
 
int cmp(const void *a,const void *b)
{
    return *(int*)a-*(int*)b;
}
 
int main(void) {
    int len,i,l,r,limit=0,ans=0;
    int a[1024];
    len = strlen(a);
    while(scanf("%d",&a[i]))
    {
        if(getchar()=='\n')
            break;
        i++;
    }
        scanf("%d",&limit);
    len=i+1;
    qsort(a,len,sizeof(int),cmp);
 
    l=0;
    r=len-1;
    while(l<=r)
    {
        if(l==r)
        {
            ans++;
            break;
        }
        if(a[l]+a[r]<=limit)
        {
            ans++;
            r--;
            l++;
        }
        else
        {
            ans++;
            r--;
        }
    }
    printf("%d",ans);
 
}

C 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2020-11-28

#include<stdio.h>
int main(void)
{
    int a[1000];
    int n,i,j,c=1,limit=0,count=0;
    int temp=0,max,min;
    while(scanf("%d",&a[n]))
    {
        if(getchar()=='\n')
            break;
        n++;
    }
    scanf("%d",&limit);
    for(i=0;i<n;i++)
    {
        for(j=0;j<n-i;j++)
        {
            if(a[i]>a[i+1])
            {
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
    }
    max=n;
    min=0;
    while(max>=min)
    {
        if(a[max]+a[min]<=limit)
        {
            max--;
            min++;
        }
        else
        {
            max--;
        }
        count++;
    }
    printf("%d",count);
    return 0;
}

上一题