【铺地毯】题解

原题目链接:Link

意思就是按一定的顺序铺地毯,后铺的地毯会覆盖前铺的地毯。最后查询点 ( x , y ) (x,y) (x,y) 最上面的是哪张地毯。

我们来分析一下样例1:

输入 #1

3
1 0 2 3
0 2 3 3
2 1 3 3
2 2

输出 #1

3

最后地面的地毯情况如下:
在这里插入图片描述
我们不用想的那么复杂,因为后面的地毯会覆盖前面的,那我们只需要倒序遍历,那么自然最先找到的肯定是在最上面的地毯,直接结束~

拿样例来分析,我们从 n n n ~ 1 1 1,先是 n n n,那么设 n n n 这个地毯的左上角是 ( a [ n ] , b [ n ] ) (a[n],b[n]) (a[n],b[n]),那么根据题意,它的右下角坐标就是 ( a [ n ] + g [ n ] , b [ n ] + k [ n ] ) (a[n]+g[n],b[n]+k[n]) (a[n]+g[n],b[n]+k[n]) x x x [ a [ n ] , a [ n ] + g [ n ] ] [a[n],a[n]+g[n]] [a[n],a[n]+g[n]] 内, y y y 也在 [ b [ n ] , b [ n ] + k [ n ] ] [b[n],b[n]+k[n]] [b[n],b[n]+k[n]] 内,说明点 ( x , y ) (x,y) (x,y) 在被地毯 n n n 覆盖,直接输出 i ( n ) i(n) i(n) 即可。(如果 ( x , y ) (x,y) (x,y) 没有被任何地毯覆盖则输出 − 1 -1 1

Code :

#include <cstdio>
using namespace std;
const int Maxn = 1e4 + 5; 
int n, a[Maxn], b[Maxn], g[Maxn], k[Maxn], x, y;
int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n; ++i) scanf("%d %d %d %d", &a[i], &b[i], &g[i], &k[i]);
	scanf("%d %d", &x, &y);
	for(int i = n; i >= 1; --i) { // 倒序遍历,先看上面的地毯 
		int c = a[i] + g[i], d = b[i] + k[i]; // 右下的坐标 
		if(x >= a[i] and x <= c and y >= b[i] and y <= d) { // 是否在地毯覆盖范围内 
			printf("%d", i);
			return 0;
		}
	}
	puts("-1"); // 该点上面没有地毯 
	return 0;
} 

不得不说,作为提高组的题,它确实有点水

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值