箱子打包(贪心策略)

1045. 箱子打包

单点时限: 2.0 sec

内存限制: 256 MB

有一组 1 维的物品需要打包进一批同样的箱子中。所有的箱子有完全一样的长度 l 以及每一个物品长度 li<=l. 我们要找到一个最小的数字 q, 使得 :

(1) 每个箱子最多包含两个物品

(2) 每个物品要被包含在 q 个箱子中的一个中

(3) 在箱子中物品的总长度不能超过 l

你的任务是,给定 n 个整数,l,l1,l2....ln, 计算最小的箱子总数 q.

输入格式

第一行包含一个数字 n(1<= n <= 10^5), 表示有几个物品。第二行包含一个整数表示了箱子的长度 l (l<=10000). 接下去的 n 行是表示了每个物品的长度。

输出格式

输出一个整数,表示能够包含所有物品的最小的箱子总数。
提示 :

The sample instance and an optimal solution is shown in the figure below. Items are numbered from 1 to 10 according to the input order.

样例

input
10
80
70
15
30
35
10
80
20
35
10
30
output
6
 
解答:
/*
-------------------------------------------------
   Author:       wry
   date:         2022/3/1 17:10
   Description:  test
-------------------------------------------------
*/

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5+10;

int project[MAXN];    //商品长度信息

int main() {
    int n,l,number=0;
    cin >> n >> l;
    for (int i=0;i<n;i++) {
        cin >> project[i];
    }
    sort(project,project+n);    //从小到大
    int i=0,j=n-1;
    while(i<=j) {
        if (i==j) {
            number++;
            break;
        }
        else {    //p<q
            if (project[i]+project[j]<=l) {
                number++;
                i++;
                j--;
            }
            else {
                number++;
                j--;
            }
        }
    }
    cout << number << endl;
    return 0;
}

 

posted @ 2022-03-03 16:04  火星架构师  阅读(173)  评论(0编辑  收藏  举报