矩形分割

总时间限制: 

1000ms

 

内存限制: 

65536kB

描述

平面上有一个大矩形,其左下角坐标(0,0),右上角坐标(R,R)。大矩形内部包含一些小矩形,小矩形都平行于坐标轴且互不重叠。所有矩形的顶点都是整点。要求画一根平行于y轴的直线x=k(k是整数) ,使得这些小矩形落在直线左边的面积必须大于等于落在右边的面积,且两边面积之差最小。并且,要使得大矩形在直线左边的的面积尽可能大。注意:若直线穿过一个小矩形,将会把它切成两个部分,分属左右两侧。

输入

第一行是整数R,表示大矩形的右上角坐标是(R,R) (1 <= R <= 1,000,000)。
接下来的一行是整数N,表示一共有N个小矩形(0 < N <= 10000)。
再接下来有N 行。每行有4个整数,L,T, W 和 H, 表示有一个小矩形的左上角坐标是(L,T),宽度是W,高度是H (0<=L,T <= R, 0 < W,H <= R). 小矩形不会有位于大矩形之外的部分。

输出

输出整数n,表示答案应该是直线 x=n。 如果必要的话,x=R也可以是答案。

样例输入

1000
2
1 1 2 1
5 1 2 1

样例输出

5

一道二分水题,但是由于定义变量重复,wa了好多发ÿ

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个关于矩形分割的问题。根据某些方面的需求,我们要把一个n×m的木板切成一个个1×1的小方块。对于一个块木板,我们只能从某条横线或者某条竖线(要在格线上)下去切割,而且要保证切割后得到的木板不是不平均的,从不同的线切下去的代价也不同。 ### 回答2: 我们希望使得最终的所有小方块的代价之和最小。这个问题可以用动态规划算法来解决。 首先考虑木板的横向切割。定义一个二维数组dp[i][j]表示将从第i行到第j行的部分木板切成小方块的最小代价。当i=j时,说明只有一行,无需切割,代价为0。当i<j时,假设我们选择在第k行进行切割,则最小代价为dp[i][k]+dp[k+1][j]+第i到第j行的木板的代价之和。为了求出每一行到每一行的木板代价之和,我们可以在预处理时用一个前缀和sum[i][j]表示从第1行到第i行,从第j列到第m列的木板代价之和。具体地,sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+第i行第j列的木板代价。因此,第i到第j行的木板代价之和为sum[j][m]-sum[i-1][m]-sum[j][0]+sum[i-1][0]。最后的答案即为dp[1][n]。 接下来考虑竖向切割。同样地,定义一个二维数组dp[i][j]表示将从第i列到第j列的部分木板切成小方块的最小代价。当i=j时,代价为0。当i<j时,假设我们选择在第k列进行切割,则最小代价为dp[i][k]+dp[k+1][j]+第i到第j列的木板的代价之和。为了求出每一列到每一列的木板代价之和,可以先将整个木板逆时针旋转90度,然后按照之前的方法进行计算,最后再将答案逆时针旋转90度。 总的时间复杂度为O(n^3),可以通过本题。 ### 回答3: 我们的目标是最小化这个代价,使得木板被分割成1×1的小方块。这种问题就叫做矩形分割矩形分割问题实质上就是一道动态规划问题。我们可以先定义一个二维数组f[i, j],表示将i列j行的矩形分割成1×1的小方块所需要的最小代价。同时,我们还需要定义一个代价数组c[i, j],表示从第i条竖线或第j条横线切割下去所需要的代价。 根据问题描述,我们可以得出f[i, j]的转移方程如下: f[i, j] = min{f[i-1, j]+c[i, j], f[i, j-1]+c[i, j]} 其中,f[i-1, j]表示将i-1列j行的矩形分割成小方块后所需要的最小代价,f[i, j-1]表示将i列j-1行的矩形分割成小方块后所需要的最小代价,c[i, j]表示从第i条竖线或第j条横线切割下去所需要的代价。因此,f[i, j]就是这两个值中的较小值加上c[i, j]。 最终,我们就可以得出将整块n×m的矩形分割成1×1小方块的最小代价,即f[n, m]。这个问题虽然看起来比较简单,但是要写出正确的代码还是有一定难度的。因此,需要我们多加练习,积累经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值