【铺地毯】题解
原题目链接: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;
}
不得不说,作为提高组的题,它确实有点水。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现