每日一题——阻挡广告牌 II

169 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

题目描述

奶牛贝茜曾经从农场中向外看去,可以看到两个刊登着美味的牛饲料广告的广告牌,这令她非常满意。

不幸的是,其中一个广告牌最近已更新,现在刊登着广告“农民拉里的割草机”。

但是贝茜可不喜欢割草机,这些割草机只会把她爱吃的草割的一干二净。

幸运的是,剩下的牛饲料广告牌位于割草机广告牌的前面,有可能将其遮挡住。

贝茜希望这个讨厌的割草机广告牌能够完全从自己的视线中消失,并为此制定了一个冒险计划。

她计划从谷仓里偷一个大的矩形防水布,并在深夜偷偷溜走,用它覆盖割草机广告牌的其余部分,使得她能完全看不到割草机广告牌。

给定两个广告牌的位置,请帮助贝茜计算她所需要的防水布的最小面积。

由于谷仓中只有矩形的防水布,因此贝茜发现为了将割草机广告牌完全遮盖,所需的防水布面积可能会大于割草机广告牌的裸露面积,如下例所示。

防水布在放置时,其边必须与广告牌的边平行,即不能倾斜放置。

输入格式

第一行包含四个整数 x1,y1,x2,y2x1,y1,x2,y2,其中 (x1,y1)(x1,y1) 和 (x2,y2)(x2,y2) 表示割草机广告牌的左下角和右上角坐标。

第二行按照如上形式,包含四个整数,表示牛饲料广告牌的左下角和右上角坐标。

牛饲料广告牌可能完全遮盖了割草机广告牌,或部分遮盖了割草机广告牌,也可能完全没有遮盖割草机广告牌。

输出格式

输出用来遮盖割草机广告牌的防水布的最小面积。

数据范围

−1000≤x1,y1,x2,y2≤1000−1000≤x1,y1,x2,y2≤1000

输入样例:

2 1 7 4
5 -1 10 3

输出样例:

15

样例解释

虽然牛饲料广告牌遮盖住了割草机广告牌的右下角的一部分,但这并没有起到作用。

想要完全遮盖割草机广告牌,仍然需要一块和它尺寸相同的防水布。

思路

本题主要可以采用分类讨论和模拟的思路,这里我们使用分类讨论。如果牛饲料广告牌只覆盖了割草机广告的一角,那么我们需要割草机广告牌那么大的矩形防水布;如果覆盖了长度,那么只需要把没覆盖的宽度和长度算出面积就是我们的答案,注意:这里要注意,虽然覆盖了长度,但宽度只是横穿过去,这时我们也必须使用割草机广告牌那么大的矩形防水布;情况如下:

image.png

同理可得覆盖了宽度的情况;

代码

#include <iostream>
#include <cstring>
#include <algorithm>
​
using namespace std;
​
const int N = 1010;
​
int q[N], a[N];
​
int main()
{
    for(int i = 1;i <= 4;i ++)
    {
     int b;
     cin >> b;
     q[i] = b;   
    }
    for(int i = 1;i <= 4;i ++)
    {
     int b;
     cin >> b;
     a[i] = b;   
    }
    
    // 如果只覆盖了一个角,那么取全部的剃草机的面积
    int row = max(0, min(q[3], a[3]) - max(q[1], a[1]));
    int del = max(0, min(q[4], a[4] - max(q[2], a[2])));
    cout << row << ' ' << del << endl;
    int res = 0;
    int a1 = q[3] - q[1], a2 = q[4] - q[2];
    int a3 = a[3] - a[1], a4 = a[4] - a[2];
    
    
    if(a[1] == min(a[1], q[1]) && a[2] == min(a[2],q[2]) && a[3] == max(a[3], q[3]) && a[4] == max(a[4], q[4]))
    {
        cout << res << endl;
    }
    else if(row < a1 && del < a2)
    {
     res = a1 * a2;
     cout << res << endl;
    }
    // 长度覆盖
    else if(row <= a3)
    {
        // 未完全覆盖
        if(q[4] == max(q[4], a[4]) && q[2] == min(a[2], q[2]))
        {
            res = a1 * a2;
            
        }
        //cout << a1 << ' ' << a2 - del<< endl;
        else res = a1 * (a2 - del);
        cout << res << endl;
    }
    // 宽度覆盖
    else if(del <= a4)
    {
        // 未完全覆盖
        if(q[3] == max(q[3], a[3]) && q[1] == min(a[1], q[1])) res = a1 * a2;
        else res = a2 * (a1 - row);
        cout << res << endl;
    }
      
}

\