[NOIP2011 提高组] 铺地毯
题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
输入格式
输入共 n + 2 行。
第一行,一个整数 n,表示总共有 n 张地毯。
接下来的 n 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个整数 a ,b ,g ,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标 (a, b) 以及地毯在 x 轴和 y 轴方向的长度。
第 n + 2 行包含两个整数 x 和 y,表示所求的地面的点的坐标 (x, y)。
输出格式
输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出 -1。
样例 1
样例输入 1
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2
样例输出 1
3
样例 2
样例输入 2
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5
样例输出 2
-1
提示
【样例解释 1】
如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点 (2,2) 的最上面一张地毯是 3 号地毯。
首先,分析每一组输入的四个数据a,b,g,k;
(a,b)—— 地毯的左下角的坐标
g —— 地毯的横向长度
k —— 地毯的纵向长度
可以创建结构体node存储关于地毯的四种信息。也可以分成四个数组分开存储。
struct node
{
int a,b;//左下角的坐标
int g,k;//分别表示x、y轴上面的坐标
};
因此,对于某一个坐标(x,y)的点,我们可以通过下面的两个不等式来判断点(x,y)是否被地毯覆盖。
不等式:
1.判断横坐标是否符合条件 —— a<=x<=a+g
2.判断纵坐标是否符合条件 —— b<=y<=b+k
由于只需要我们输出覆盖在点(x,y)的最上面的地毯的编号,所以直接按照输入顺序的逆序进行遍历,每一次都判断点(x,y)是否被当前地毯覆盖。如果被覆盖,输出当前地毯的编号;否则继续遍历。当遍历完所有的地毯都没有输出的时候,就需要输出-1。
#include<iostream>
using namespace std;
struct node
{
int a,b;//左下角的坐标
int g,k;//分别表示x、y轴上面的坐标
};
int main()
{
int n;
cin>>n;
node total[n+1];
for(int i=1;i<=n;i++)
cin>>total[i].a>>total[i].b>>total[i].g>>total[i].k;
int end_x,end_y;//终点坐标
cin>>end_x>>end_y;
bool flag=false;
for(int i=n;i>=1;i--)
{
if((total[i].a<=end_x&&end_x<=total[i].a+total[i].g)&&(total[i].b<=end_y&&end_y<=total[i].b+total[i].k))
{
cout<<i<<endl;
flag=true;
break;
}
}
if(!flag)
cout<<-1<<endl;
return 0;
}
635

被折叠的 条评论
为什么被折叠?



