数学 HDOJ 5301 Buildings

本文解析了HDOJ5301 Buildings的题意与解题思路,涉及矩阵填充与矩形面积计算的问题。通过讨论最优填充方案,给出了具体的实现代码。

 

题目传送门

 1 /*
 2    题意:n*m列的矩阵,删除一个格子x,y。用矩形来填充矩阵。且矩形至少有一边是在矩阵的边缘上。
 3    求满足条件的矩形填充方式中面积最大的矩形,要使得该最大矩形的面积最小。   
 4    分析:任何矩形都可以分为宽度为1的小矩形,所以只考虑矩形的可以的最小长度即可。 
 5    讨论方法:这里   (我不会。。。)
 6  */
 7 #include <cstdio>
 8 #include <algorithm>
 9 #include <cstring>
10 using namespace std;
11 typedef long long ll;
12 
13 int main(void)  {       //HDOJ 5301 Buildings
14     ll n, m, x, y;
15     while (scanf ("%I64d%I64d%I64d%I64d", &n, &m, &x, &y) == 4) {
16         if (n > m)  {
17             swap (n, m);    swap (x, y);
18         }
19         if (x > n - x + 1)  {
20             x = n - x + 1;
21         }
22         if (y > m - y + 1)  {
23             y = m - y + 1;
24         }
25         ll hm = (m + 1) / 2, hn = (n + 1) / 2;
26         ll ans = min (hm, hn);
27         if (m == n) {
28             if (m % 2 == 1) {
29                 if (x == hn && y == hm) ans--;
30             }
31         }
32         else    {
33             ll t = min (y, n - x);
34             ans = max (ans, t);
35             ans = min (ans, hm);
36         }
37         printf ("%I64d\n", ans);
38     }
39 
40     return 0;
41 }

 

转载于:https://www.cnblogs.com/Running-Time/p/4671785.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值