箱子打包 贪心算法
题目来源: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;
}
