箱子打包 贪心算法

题目来源:https://acm.ecnu.edu.cn/problem/1045

//B站网盘 箱子打包

//思路:每次只装一个箱子,选最大和最小的装箱,若溢出则只装最大的物品
//尽可能少的装箱数 贪心策略
// 1、将问题拆分 考虑每次只装一个箱子
//2、保证该箱子尽可能装的满(不能超过两个物品) 如果排序后,只装最小两个值 两个值 会浪费空间
        //每次选最大的和最小的商品装箱 若溢出,则只装最大的商品,因为我们对商品拍虚了
        //如果小商品A和大商品D没办法,还要装A,则之后的B会更大,会更装不下,于是选最小的和最大的,溢出装最大
//3、局部->全局

#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
const int MAXN=1e5 +10;
int length[MAXN];//有n个物品,每次输入它的长度
int main()
{
    int n,l;//n是物品的长度 l是箱子的固定长度
   scanf("%d%d",&n,&l);

        //scanf("%d",&l);//输入箱子的长度
        for(int i=0;i<n;i++)
        {
            scanf("%d",&length[i]);
        }//输入n个物品的长度
        //对装入物品的长度排序
        sort(length,length+n);//升序排
        int left=0;
        int right=n-1;
        int q=0;//箱子总数
        //贪心算法拆解 装一个箱子。选择最小和最大,如果溢出,则装入最大
        while(left<=right)
        {
//            if(left==right)
//                {
//                    q++;
//                    break;
//                }//这段判断是考虑到了只有最后一个物品的情况,但是当只有最后一个物品的时候
//              left ==right 同样满足以下的ifelse 如果相加<l q++ 如果大于l 只装入一个 right-- 此时left!=right 可以跳出循环
            if(length[left]+length[right]<=l)
            {
               // q++;//如果可以装入则q++
                left++;
                right--;
            }
            else//如果选择的最大值和最小值装不下这个箱子,装入最大值物品
            {
                //q++;
                right--;
            }
            q++;

        }

        printf("%d\n",q);

    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务