独木舟

· · 个人记录

题目信息

旅行社计划组织一个独木舟旅行,租用的独木舟都是一样的,最多乘两人,而且载重有一个限度。 现在要节约费用,所以要尽可能地租用最少的舟。 本题的任务是读入独木舟的载重量,参加旅行的人数以及每个人的体重,计算出所需要的独木舟数目。

输入格式

第 1 行是 w(80≤w≤200),表示每条独木舟最大的载重量。 第 2 行是正整数 n(1≤n≤30000),表示参加旅行的人数。 接下来的 n 行,每行是一个正整数 ti(5≤ti≤w),表示每个人的重量。

输出格式

输出一行一个数,表示最少的独木舟数目。

分析

因为要节约费用,所以要尽可能地租用最少的船,我们需要使得船的浪费是最少的。一艘船乘坐的人数最大为2,但是船的载重量是有特定要求的,所以在这样的情况下,会有以下的思考:

此时我们想要使得浪费最少,那么应该是两个人搭配进行乘船,也就是我们需要找到两个人的体重和小于等于船的载重量。

这两个人怎么找?

随便选的话,这样考虑起来太过于复杂。如果进行枚举,人数又很多,会超时。所以我们思考,怎么取浪费会最少。

想要让浪费最少,那么我们就需要看一下,在最轻的人乘船时,最重的能不能跟着最轻的坐在一条船上,如果可以,那么此时让最轻的和最重的坐在一条船上。

    i 代表最轻的人的编号
    j 代表最重的人的编号

    if(a[i]+a[j]<=船的载重量){
        此时 i 和 j 同时上船,然后考虑下一组       
    }
    else{  
        这里表示最轻的和最重的搭配在一起的时候无法上船,所以此时我们只能让最重的单独一条船,让后让最轻的和第二重的进行搭配。
    }

贪心策略: 按照人的体重进行升序排序,然后挑选出最轻的和最重的一条船,如果此时体重大于载重量,则最重的单独一条船。反之,如果两人体重不大于载重量,则这两个人搭配在一起租一条船。 后面持续下去...直到所有人安排完


#include<bits/stdc++.h>
using namespace std;
/*
解析:要尽可能租用最少的,而且每条船最多乘两人
如果最小的加上最大的都超过载重量,那么最大的只能单独一条船。
那么此时再用最小的加上第二大的 
*/ 
int a[30005];
int main()
{
    int w,n,i,cnt=0;
    int start,end;
    cin>>w>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];  
    } 
    //升序排序 
    sort(a+1,a+n+1);
    //给定两个指针 
    start=1;
    end=n;
    //只要start没有超过end 
    while(start<=end)
    {
        //最小的和最大的相加,判断是否小于载重量 
        if(a[start]+a[end]<=w)
        {
            cnt++; //消耗一条船 
            start++; //start指针向后走 
            end--; //end指针向前走 
        }
        else
        {
            cnt++; //最大的独自消耗一条船 
            end--; 
        }
    }
    cout<<cnt;
    return 0;
}