原题链接:1749. 阻挡广告牌 II - AcWing题库
不过啊,前身和后面没什么关系,所以不看前身也可以;
那么通过观察我们的题,我们发现这是一道很复杂的多情况讨论题,啊,虽然说着是简单题的难度,但是分析的情况真的很多,要是比赛或者是考试遇到这种属于简单题的行列,放在最后在慢慢写也可以;
那么我们来分析情况,我们是用x,y代表饲料牌子坐标,用a,b代表割草机牌子坐标;
我们发现,最基本的有两种情况:

也别管谁是饲料牌谁是割草机牌,只要出现这种情况,说明饲料牌并没有将x边或者y边覆盖,那么我们所求的遮盖布的最大面积就不会变,也就是原样输出即可;
接下来根据覆盖程度可分为三种情况,分别是不覆盖,覆盖x边,覆盖y边;
不覆盖的情况很简单,我们只需要判断有交边没有即可;
接下来的两种情况又可以分别分为三种情况
1:

2:

3:

这是割草机牌的x上下大于饲料牌的情况,对于y的情况,同样的分析即可;
那么对于前两种情况,我们正常分析即可;但是最后一种情况,这里注意,我们的遮挡布只有一张,也就是说我们不能同时分成俩部分去覆盖,所以最后一种情况也就是和面积完全不变一样的;
在这里注意一点就是,我们的第三种情况的条件是饲料牌的x(y)大于割草机的x(y)并且y(x)小于割草机的x(y),这里是并列的关系,但是前两种情况也有此关系,所以这里我们就要考虑前后顺序,将第三种情况放在第一即可;
具体代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a1,b1,a2,b2;
int x1,y1,x2,y2;
cin>>a1>>b1>>a2>>b2;//割草机
cin>>x1>>y1>>x2>>y2;//饲料
//一定要分清ab与xy坐标代表的到底是哪个牌子
int ans=abs(a1-a2)*abs(b1-b2);
// cout<<ans<<endl;
if(x1<=a1&&y1<=b1&&x2>=a2&&y2>=b2)
ans=0;//完全不挨边的情况
else if(x1<=a1&&x2>=a2)//x边被覆盖
{
if(y1>=b1&&y2<=b2)
ans=ans;
else if(y1>=b1&&y1<=b2)
ans-=abs(y1-b2)*abs(a1-a2);
else if(y2>=b1&&y2<=b2)
ans-=abs(y2-b1)*abs(a1-a2);
}
else if(y1<=b1&&y2>=b2)//y边被覆盖
{
if(x1>=a1&&x2<=a2)
ans=ans;
else if(x1<=a1&&x2>=a2)
ans-=abs(x1-a2)*abs(b1-b2);
else if(x2>=a1&&x2<=a2)
ans-=abs(x2-a1)*abs(b1-b2);
}
cout<<ans;
}
这里还有一个问题,如果询问我们的覆盖面积,由于给的是坐标,我们只需要把两点间距离-1成为面积的长度即可,这里并没有用到,但是大家需要知道这个知识,具体的题就是上面给出的前身的题目;
至此,完结撒花;
本文详细分析了一道关于计算广告牌遮挡面积的编程题,涉及多种覆盖情况的讨论,包括完全不覆盖、覆盖边界的判断以及不同覆盖程度的处理。通过坐标比较,确定遮挡布的最大面积,并给出了相应的C++代码实现。
352

被折叠的 条评论
为什么被折叠?



