hihocoder1365 图片排版

思路:

模拟,枚举,dp。

参考了https://github.com/buptlxb/hihoCoder/blob/master/solutions/1365/picture_arrange.cpp

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int w[100005], h[100005], dp[100005], m, n;
 5 
 6 void arrange(int w, int h, int& rw, int& rh)
 7 {
 8     if (rw >= w) { rw -= w; rh = max(rh, h); }
 9     else { rh = max(rh, (rw * h + w - 1) / w); rw = 0; }
10 }
11 
12 int solve()
13 {
14     for (int i = n - 1; i >= 0; i--)
15     {
16         int rw = m, maxh = 0;
17         int j = i;
18         for ( ; j < n && rw; j++)
19             arrange(w[j], h[j], rw, maxh);
20         dp[i] = dp[j] + maxh;
21     }
22     int minn = dp[1], th = 0, rw = m, rh = 0;
23     for (int i = 0; i < n; i++)
24     {
25         arrange(w[i], h[i], rw, rh);
26         if (!rw) { th += rh; rw = m; rh = 0; }
27         int j = i + 2, tmpw = rw, tmph = rh;
28         for ( ; j < n && tmpw; j++)
29         {
30             arrange(w[j], h[j], tmpw, tmph);
31         }
32         minn = min(minn, th + tmph + (j < n ? dp[j] : 0));
33     }
34     return minn;
35 }
36 
37 int main()
38 {
39     cin >> m >> n;
40     for (int i = 0; i < n; i++)
41     {
42         cin >> w[i] >> h[i];
43     }
44     cout << solve() << endl;
45     return 0;
46 }

 

转载于:https://www.cnblogs.com/wangyiming/p/7623645.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值