题目描述
有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
题解
很简单的一道贪心题,每次尽可能用承重量大的车撞重的货物即可。
#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; }