BZOJ 4302 Buildings 解题报告
2015-10-25 09:11
393 查看
这个题好像很有趣的样子。
题目分析:
房间都是 $1\times k$ 的,也就是一条一条的。这个好像比较显然的样子。
一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Boundry)$,即其到边界的距离,这个好像也比较显然的样子。
于是答案至少是 $max\{dis(u, Boundry)\}$,然后可以通过构造来取到最小值,即答案就是$max\{dis(u, Boundry)\}$。
算法流程:
特判:如果输入的是一个边长为一个奇数的正方形,且 $(x,y)$ 恰好是正方形的中心,那么答案为 $\frac{n-1}{2}$。
初始化:因为答案至少是 $\lfloor\frac{min(n,m)+1}{2}\rfloor$(考虑最中心的格子),故令答案初始化为这个东西。
更新答案:然后我们只需要找 $(x,y)$ 旁边的四个格子,计算其到边界的距离,然后和初始答案取最大值就是最终答案了。
一些细节:
枚举 $(x,y)$ 的相邻的格子的时候,要注意一下这个格子是否合法。
怎么计算 $dis(u, Boundry)$ 呢?直接枚举拓展的方向,看要走多少步才能到达边界,取其最小步数。
计算距离的时候要注意只能从三个方向拓展,有一个方向会经过 $(x,y)$,是走不动的。
时间复杂度:$O(T)$,空间复杂度:$O(1)$。
4302_Gromah
题目分析:
房间都是 $1\times k$ 的,也就是一条一条的。这个好像比较显然的样子。
一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Boundry)$,即其到边界的距离,这个好像也比较显然的样子。
于是答案至少是 $max\{dis(u, Boundry)\}$,然后可以通过构造来取到最小值,即答案就是$max\{dis(u, Boundry)\}$。
算法流程:
特判:如果输入的是一个边长为一个奇数的正方形,且 $(x,y)$ 恰好是正方形的中心,那么答案为 $\frac{n-1}{2}$。
初始化:因为答案至少是 $\lfloor\frac{min(n,m)+1}{2}\rfloor$(考虑最中心的格子),故令答案初始化为这个东西。
更新答案:然后我们只需要找 $(x,y)$ 旁边的四个格子,计算其到边界的距离,然后和初始答案取最大值就是最终答案了。
一些细节:
枚举 $(x,y)$ 的相邻的格子的时候,要注意一下这个格子是否合法。
怎么计算 $dis(u, Boundry)$ 呢?直接枚举拓展的方向,看要走多少步才能到达边界,取其最小步数。
计算距离的时候要注意只能从三个方向拓展,有一个方向会经过 $(x,y)$,是走不动的。
时间复杂度:$O(T)$,空间复杂度:$O(1)$。
#include <cstdio> #include <algorithm> using namespace std; const int Fx[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; int n, m, x, y; inline int Calc(int tx, int ty, int k) { int Min = min(n, m); for (int i = 0; i < 4; i ++) { if (k == i) continue ; if (i == 0) Min = min(Min, n + 1 - tx); if (i == 1) Min = min(Min, tx); if (i == 2) Min = min(Min, m + 1 - ty); if (i == 3) Min = min(Min, ty); } return Min; } inline int Solve() { if (n == m && (n & 1) && x == y && (x * 2 - 1 == n)) return n - 1 >> 1; int ans = min(n, m) + 1 >> 1; for (int k = 0; k < 4; k ++) { int tx = x + Fx[k][0], ty = y + Fx[k][1]; if (tx && ty && tx <= n && ty <= m) ans = max(ans, Calc(tx, ty, k ^ 1)); } return ans; } int main() { while (scanf("%d%d%d%d", &n, &m, &x, &y) == 4) printf("%d\n", Solve()); return 0; }
4302_Gromah
相关文章推荐
- Hadoop应用-------Hadoop计算能力调度器(Capacity Scheduler)应用和配置{hadoop mradmin -refreshQueues动态更新队列和容量}其他调度器比较
- Learn from Synchronized and BlockingQueue
- Leetcode: Unique Paths
- UE4蓝图案例:制作透明黑色玻璃
- Queue
- POJ 1458 Common Subsequence
- POJ 1458 Common Subsequence
- Android:带你玩转Servie,子线程,与UI线程通信[导入导出]
- cf 11a Increasing Sequence
- Positional parameter does not exist: 1 in query: from Books where isbn=?
- 转载:为什么首次进入界面是SwipeRefreshLayout.setRefreshing(true)没有动画效果
- 【APUE】Chapter12
- 《西安交大电路》(Principles of Electrical Circuits) 学习笔记
- [AndroidUI]自定义view(五):实现动态柱状图
- 实例解析JS布尔对象的toString()方法和valueOf()方法
- uibutton 的setImage和setBackgroundImage的区别
- UITextField设置placeholder颜色
- UIButton 的不同设置和UITextField 的默认值(修改默认值)
- UIView 设置边框颜色 和 UILabel 的设置
- 给uiview 添加边框以及圆角