华为机试——笨笨熊搬家打包篇
题目描述:
森林里的笨笨熊今天可开心啦——他买了新房子,乔迁新喜要搬家了。因此,笨笨熊请了许多好朋友来帮忙搬家,并准备了很多小纸盒用来装需要搬的物品,不过,这些纸盒的容积都是相同的,并且最多只能装两个物品。但是,为了不打扰太多的朋友,笨笨熊想了个“聪明”办法:让每个纸盒使用效率最高(注:只要纸盒容积大于物品的体积之和就认为可以装下;物品体积不会大于纸盒容积),这样需要的纸盒最少。为了帮助笨笨熊提前通知朋友,请你根据笨笨熊的办法,帮忙算出:需要纸盒的最少数目是多少?
运行时间限制:无限制内存限制:无限制
输入:
整数V——纸盒的容积;整数N——物品的总数目N;
共N个整数(对应N个物品的体积,每个整数用空格隔开)。
输出:
整数M——需要纸盒的最少数目;
样例输入:10
2
2 3
样例输出:1
解题思路:
因为每个纸盒最多可以装下两个物品,所以可以对数据进行排序,同时从两头进行遍历,如果最右侧第j个物品和最左侧第i个物品之和小于盒子容积,总的盒子需求数减一,最初盒子需求量和物品个数相等。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int package(vector<int> &object,int n,int v)
{
sort(object.begin(),object.end());
for(int i=0,j=n-1;i<j;++i,--j)
{
while((i<j) && object[i]+object[j] >v)
--j;
if(i<j)
--n;
}
return n;
}
int main()
{
int capacity,n,num;
vector<int> object;
cin>>capacity;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num;
object.push_back(num);
}
cout<<package(object,n,capacity)<<endl;
}