洛谷 P1003 铺地毯 NOIp提高组 2011 普及-

题目链接:https://www.luogu.com.cn/problem/P1003
洛谷 P1003 铺地毯 NOIp提高组 2011 普及-
题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。

地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

输入格式
输入共 n + 2行。

第一行,一个整数 n,表示总共有 n 张地毯。

接下来的 nn 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个整数 a ,b ,g ,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标 (a, b)(a,b) 以及地毯在 x 轴和 y 轴方向的长度。

第 n + 2行包含两个整数 x 和 y,表示所求的地面的点的坐标 (x, y)。

输出格式
输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出 -1。

输入输出样例
输入
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2
输出
3

输入
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5
输出
-1
说明/提示
【样例解释 1】

如下图,1号地毯用实线表示,2 号地毯用虚线表示,3号用双实线表示,覆盖点 (2,2) 的最上面一张地毯是 3 号地毯。

洛谷 P1003 铺地毯 NOIp提高组 2011 普及-_第1张图片

【数据范围】
对于30%的数据,有n<2
对于50%的数据,0≤a,b,g,k≤100
对于100%的数据,有0 noip2011提高组day1第1题。

题解: 分析题目可以发现,只需要找出所求点对应的地方是哪张地毯即可。
我这里用了结构体实现,先确定每个地毯所在的空间区域,然后再从后往前筛选,若该点在此块低地毯区域内,则为所求结果;若均不满足条件,则输出-1.
AC代码:

#include 
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct  note
{
	int x;              
	int y;          //该块地毯的左下角坐标 
	int x1;
	int y1;          //该块地毯右上角坐标 
 }p[100002];
int main(int argc, char** argv) {
    int n,X,Y,l,h,i;
    cin>>n;                
    for(i=0;i<n;i++)
    {
    	scanf("%d%d%d%d",&p[i].x,&p[i].y,&l,&h);       //按要求输入a,b,g,k 
    	p[i].x1=p[i].x+l;                           
    	p[i].y1=p[i].y+h;                             //计算该块地毯的右上角坐标并填入结构体 
	}
	cin>>X>>Y;
	for(i=n-1;i>=0;i--)
	{
		if(X>=p[i].x&&X<=p[i].x1&&Y>=p[i].y&&Y<=p[i].y1)             //如果该点在该地毯所在区域内,则输出地毯编号 
		{
			cout<<(i+1)<<endl;
			return 0;
		}
	}
	cout<<-1<<endl;                                  //无匹配选项,输出-1 
	return 0;
}

你可能感兴趣的:(洛谷,结构体)