在刚拿到这个题的时候自然而然想到用一个二维数组来存放地毯的值,但是再查看数据之后发现
数据很大需要开到100000 这肯定会TLE的,思考之后发现我可以用四个数组去存每个地毯的长宽以及起始坐标,后面只需判断是否在这个地毯之间就行了
#include<iostream>
using namespace std;
const int N = 10005;
int a[N], b[N], g[N], k[N]; // 地毯的坐标以及长宽
int n,x,y; // 地毯数量以及 检测的点
int flag; // 信号量 用于判断 是否找到
int main() {
cin >> n;
// 这个循环将每个地毯的起始点以及长宽存入其中
for (int i = 1; i <= n; i++)
{
cin >> a[i] >> b[i] >> g[i] >> k[i];
}
cin >> x >> y;
// 从序号最大的地毯开始判断 最好的情况就是最大的就是那么就只用判断一次 如果从头开始不管
// 怎样都会判断完的。
for (int i = n; i > 0; i--)
{
// 这里一个小小的优化从最后铺的地毯开始(也就是序号最大的)开始
// 当找到序号最大的序号之后直接输出 如果没有找到的话
// 则flag 为 0 就输出-1
if (x >= a[i] && x <= a[i] + g[i] && y >= b[i] && y <= b[i] + k[i]) {
flag = 1;
cout << i;
break;
}
}
if (!flag) cout << -1;
return 0;
}