ACwing:1749 阻挡广告牌 II

原题链接:1749. 阻挡广告牌 II - AcWing题库

前身:1761. 阻挡广告牌 - 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成为面积的长度即可,这里并没有用到,但是大家需要知道这个知识,具体的题就是上面给出的前身的题目;

至此,完结撒花;

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值