-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathMinimum Space Wasted From Packaging.cpp
57 lines (52 loc) · 1.66 KB
/
Minimum Space Wasted From Packaging.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Solution {
public:
#define MOD 1000000007
#define ll long long
int minWastedSpace(vector<int>& packages, vector<vector<int>>& boxes) {
int n = packages.size();
int m = boxes.size();
sort(packages.begin(), packages.end());
vector<ll> pack(n + 1);
pack[0] = 0;
for(int i = 0;i<n; i++){
pack[i + 1] = packages[i];
pack[i + 1] += pack[i];
}
ll ans = 1e18;
bool mf = false;
for(int i = 0; i<m; i++){
vector<int> opt = boxes[i];
sort(opt.begin(), opt.end());
int back = 0;
ll temp = 0;
bool flag = false;
ll bag ;
for(int j = 0; j<(int)opt.size(); j++){
bag = opt[j];
auto it = upper_bound(packages.begin(), packages.end(), bag);
auto it1 = it;
int idx ;
if(it != packages.begin()){
it--;
idx = it - packages.begin();
ll num_packs = idx + 1 - back;
ll pack_sum = pack[idx + 1] - pack[back];
back = idx + 1;
temp += (num_packs*bag - pack_sum);
}
if(it1 == packages.end()){
flag = true;
break;
}
}
if(flag){
ans = min(ans, temp);
mf = true;
}
}
if(!mf) return -1;
if(ans == 1e18) return -1;
ans = ans % MOD;
return ans;
}
};