题目描述:
有题目的话和别人的高度相似不给审核,放链接吧,
无语。
解析:
刚拿到这个题目的时候第一个考虑的是
模拟,定义一个二维数组根据输入数据直接对数组进行赋值,最后按照输入的(x,y)去数组中查找相应的位置,输出对应的数据。比如,第一块地毯的起始位置是(1,0),宽 2,高 3,那么直接对数组中 1<=x<=3,0<=y<=3的区域赋值为 “ 1 ” ......
但根据题目最后所给出的数据范围,我们可以看到n的取值范围(地毯的数量)是 0~10000,如果直接
模拟,很容易超时,并且很复杂。于是,另外一种逆序查找就很方便了。
从最后一块地毯开始找起,看是否覆盖在所求坐标上,如果是,则输出地毯编号,如果没有,则输出“-1”。
附AC代码:
#include<iostream>
using namespace std;
int a[10001][5];
int main()
{
int n, i, x, y;
int flag = -1;
cin >> n;
for (i = 1; i <= n; i++)
{
for (int j = 1; j <= 4; j++)
{
cin >> a[i][j];
}
}
cin >> x >> y;
for (i = n; i >= 1; i--)
{
if (x >= a[i][1] && x <= (a[i][1] + a[i][3]) && y >= a[i][2] && y <= (a[i][2] + a[i][4]))
{
cout << i;
flag = -flag;
break;
}
}
if (flag == -1)
{
cout << flag;
}
}
cs202 fanyuchen