-
Notifications
You must be signed in to change notification settings - Fork 7
/
picture_arrange.cpp
61 lines (57 loc) · 1.29 KB
/
picture_arrange.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
58
59
60
61
#include <iostream>
#include <vector>
#include <limits>
#include <cmath>
#include <unordered_map>
using namespace std;
inline void arrange(int w, int h, int &cw, int &ch)
{
if (cw >= w) {
cw -= w;
ch = max(ch, h);
} else {
ch = max(ch, (cw * h + w - 1) / w);
cw = 0;
}
}
int solve(vector<int> &ws, vector<int> &hs, int m)
{
int n = ws.size();
vector<int> dp(n+1);
for (int i = n-1; i >= 0; --i) {
int cw = m, ch = 0;
int j;
for (j = i; j < n && cw; ++j) {
arrange(ws[j], hs[j], cw, ch);
}
dp[i] = ch + dp[j];
}
int ret = dp[1];
int cw = m, ch = 0, height = 0;
for (int i = 0; i < n; ++i) {
arrange(ws[i], hs[i], cw, ch);
if (cw == 0) {
cw = m;
height += ch;
ch = 0;
}
int j = i + 2, fw = cw, fh = ch;
for ( ; j < n && fw; ++j) {
arrange(ws[j], hs[j], fw, fh);
}
ret = min(ret, height + fh + (j < n ? dp[j] : 0));
}
return ret;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int m, n;
cin >> m >> n;
vector<int> ws(n), hs(n);
for (int i = 0; i < n; ++i)
cin >> ws[i] >> hs[i];
cout << solve(ws, hs, m) << endl;
return 0;
}