【题解】装货

题目描述

  有n箱货物,第i箱货物的重量是w[i],1<=i<=n。有m台起重车,第i台起重车一次只能吊一个箱子,而且要求货物最重是c[i],1<=i<=m,则如果某个箱子货物重量大于c[i],那么这台起重车吊不起。现在要用这m台起重车把所有货物都装上大卡车(假设大卡车足够大),至少需要多少秒?注意:这m台起重车可以同时工作,一台起重车装一次货物的时间是1秒,前提当然是货物重量不超过起重车的最大能力。如果无法完成装载所有的货物,输出-1.

输入输出格式

输入格式

  第一行:两个整数m, n。 1<=n<=2500, 1<=m<=50。
  第二行:m个整数,第i个整数表示c[i]。1<=c[i]<=1000000。
  第三行:n个整数,第i个整数表示w[i]。1<=wi]<=1000000。

输出格式

  一个整数,表示最小的装载时间,或者-1.

输入输出样例

输入样例

4  10
23  32  25  28
5  27  10  16  24  20  2  32  18  7

输出样例

3

题解

  很简单的一道贪心题,每次尽可能用承重量大的车撞重的货物即可。

扫描二维码关注公众号,回复: 5631386 查看本文章
#include <iostream>
#include <algorithm>

#define MAX_N (2500 + 5)
#define MAX_M (50 + 5)

using namespace std;

int n, m;
int a[MAX_N], c[MAX_M];
int ans;

int main()
{
    cin >> m >> n;
    for(register int i = 1; i <= m; ++i)
    {
        cin >> c[i];
    }
    for(register int i = 1; i <= n; ++i)
    {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    sort(c + 1, c + m + 1);
    if(a[n] > c[m]) return cout << -1, 0;
    int cnt = n;
    int i, j;
    while(cnt)
    {
        ++ans;
        i = n, j = m;
        while(i && j)
        {
            if(a[i] && a[i] <= c[j])
            {
                a[i] = 0;
                --j;
                --cnt;
            } 
            --i;
        }
    }
    cout << ans;
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10585198.html