• BZOJ 4302 Buildings 解题报告


    这个题好像很有趣的样子。

    题目分析:

    1. 房间都是 $1 imes k$ 的,也就是一条一条的。这个好像比较显然的样子。
    2. 一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Boundry)$,即其到边界的距离,这个好像也比较显然的样子。
    3. 于是答案至少是 $max{dis(u, Boundry)}$,然后可以通过构造来取到最小值,即答案就是$max{dis(u, Boundry)}$。

    算法流程:

    1. 特判:如果输入的是一个边长为一个奇数的正方形,且 $(x,y)$ 恰好是正方形的中心,那么答案为 $frac{n-1}{2}$。
    2. 初始化:因为答案至少是 $lfloorfrac{min(n,m)+1}{2} floor$(考虑最中心的格子),故令答案初始化为这个东西。
    3. 更新答案:然后我们只需要找 $(x,y)$ 旁边的四个格子,计算其到边界的距离,然后和初始答案取最大值就是最终答案了。

    一些细节:

    1. 枚举 $(x,y)$ 的相邻的格子的时候,要注意一下这个格子是否合法。
    2. 怎么计算 $dis(u, Boundry)$ 呢?直接枚举拓展的方向,看要走多少步才能到达边界,取其最小步数。
    3. 计算距离的时候要注意只能从三个方向拓展,有一个方向会经过 $(x,y)$,是走不动的。

    时间复杂度:$O(T)$,空间复杂度:$O(1)$。

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int Fx[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
     6 int n, m, x, y;
     7 
     8 inline int Calc(int tx, int ty, int k)
     9 {
    10     int Min = min(n, m);
    11     for (int i = 0; i < 4; i ++)
    12     {
    13         if (k == i) continue ;
    14         if (i == 0) Min = min(Min, n + 1 - tx);
    15         if (i == 1) Min = min(Min, tx);
    16         if (i == 2) Min = min(Min, m + 1 - ty);
    17         if (i == 3) Min = min(Min, ty);
    18     }
    19     return Min;
    20 }
    21 
    22 inline int Solve()
    23 {
    24     if (n == m && (n & 1) && x == y && (x * 2 - 1 == n))
    25         return n - 1 >> 1;
    26     int ans = min(n, m) + 1 >> 1;
    27     for (int k = 0; k < 4; k ++)
    28     {
    29         int tx = x + Fx[k][0], ty = y + Fx[k][1];
    30         if (tx && ty && tx <= n && ty <= m)
    31             ans = max(ans, Calc(tx, ty, k ^ 1));
    32     }
    33     return ans;
    34 }
    35 
    36 int main()
    37 {
    38     while (scanf("%d%d%d%d", &n, &m, &x, &y) == 4)
    39         printf("%d
    ", Solve());
    40     
    41     return 0;
    42 }
    4302_Gromah
  • 相关阅读:
    GIT笔记
    C++新式类型转换
    C++ 静态链表基本算法实现
    C++ 顺序栈基本算法实现
    C++ 链栈 基本算法实现
    C++ 循环队列基本算法实现
    C++ 链队列基本算法实现
    C++优先级队列表基本算法实现
    C++单链表基本算法实现
    C++ 循环链表基本算法
  • 原文地址:https://www.cnblogs.com/gromah/p/4908227.html
Copyright © 2020-2023  润新知