题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n 张地毯,编号从1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
【数据范围】
对于 30%的数据,有n≤2;
对于 50%的数据,0≤a, b, g, k≤100;
对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。
输入
输入共 n+2 行。
第一行,一个整数 n,表示总共有n 张地毯。
接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每
两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x
轴和y 轴方向的长度。
第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)
输出
输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。
SUPERBIA!!!
话说回来二维数组可解
四个一维数组————竟貌似 也可解!!!-0-
具体看代码(二维秒过)
PS(由于MARKDOWN编辑器的奇葩性,#include显不出来,自行枪毙半小时….)
||?
int main()
{
int n,i,j,x,y,a[10000][4]={0},t=0;
scanf(“%d”,&n);
for(i=0;i<=n-1;i++)
{
scanf(“%d%d%d%d”,&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
a[i][2]+=a[i][0];//右下角横坐标
a[i][3]+=a[i][1];//右下角纵坐标
}
scanf(“%d%d”,&x,&y);
for(i=0;i<=n-1;i++)
if(a[i][0]<=x&&a[i][1]<=y&&a[i][2]>=x&&a[i][3]>=y)//判断所求点是否在范围内
t=i+1;//赋值
if(t==0)printf(“-1”);//判断是否为0
else
printf(“%d”,t);
return 0;
}
题解二(一维数组)
int n,ans=-1;
int x,y;
int x1[15000],y1[15000],x2[15000],y2[15000];
int main()
{
scanf(“%d”,&n);
for(int i=1;i<=n;i++)
scanf(“%d %d %d%d”,&x1[i],&y1[i],&x2[i],&y2[i]);
scanf(“%d %d”,&x,&y);
for(int i=1;i<=n;i++)
if(x1[i]+x2[i]>=x&&y1[i]+y2[i]>=y&&x1[i<=x&&y1[i]<=y)ans=i;
printf(“%d”,ans);
return 0;
}
具体思路:先确立点的坐标和地毯覆盖坐标的关系
依次覆盖,比较,输出 最近的一次,没有的话不多说了,上吧 “-1”!!!
SUPERBIA!!!
BYE