洛谷 简单的模拟 P1003 铺地毯

明个要机考了,今天来练练手。
这题的重点思路在于倒序寻找,即如果在k号地毯覆盖了点(x,y),那么就不需要检查k-1,k-2,…,1,0号地毯了,因为即使有,也是k号地毯在最上面。
mainPtr是一个动态二维数组,其每一个元素对应一个向量(线性表),每个向量又存储着 起始x 起始y x方向长度 y方向长度
按惯用思维的话会去设一系列标志位,从0号地毯检查到n-1号地毯,每一点每次被新的地毯覆盖时就将标志位改成新地毯,这样费事费内存。

踩过的坑:
那个英文写的“Now i should equal to n rather than n-1”是困扰了我很久的地方,因为我当初以为上面内循环完了,i应当是n-1,下面的for就没赋初值,但实际上i是n,这样访问会越界,程序卡死。
和for的运行顺序有关
假设for(初值语句A;条件语句B;循环语句C)
\ \ \ \ \ \ \ 语句块D
执行顺序为
A→检查B→D→C→检查B→D…D→C→检查B,不通过,退出。
所以实际上执行完后是B不满足的一个上确界,即在A、C下使B不再满足的最小值。
上面是i<n,每次i++,自然最后i就是n。

#include <stdio.h>
int main(int argc, char const *argv[])
{	
	int n,i,x,y,isX=0,isY=0;//isX和isY标志当前检查的地毯的范围内包不包含点(x,y)
	scanf("%d",&n);
	int **mainPtr=(int**)malloc(sizeof(int*)*n);
	for(i=0;i<n;i++)
		{
			mainPtr[i]=(int *)malloc(sizeof(int)*4);
			scanf("%d%d%d%d",&mainPtr[i][0],&mainPtr[i][1],&mainPtr[i][2],&mainPtr[i][3]);
		}
	//Now i should equal to n rather than n-1
	scanf("%d%d",&x,&y);
	for(i=n-1;i>=0;i--)//倒序检查
	{	
		isX=(mainPtr[i][0]<=x&&x<=mainPtr[i][0]+mainPtr[i][2]);
		isY=(mainPtr[i][1]<=y&&y<=mainPtr[i][1]+mainPtr[i][3]);
		if(isX&&isY)//如果点(x,y)在检查的区域内
			break;
		isX=isY=0;
	}
	//注意如果在数组的0号(对应1号地毯)找到,那么i=0;如果没有找到,i=-1
	printf("%d",i==-1?-1:i+1);//如果i是-1就直接打印-1,否则打印i+1(数组从0开始计数,地毯从1开始计数)
	for(i=0;i<n;i++)
		free(mainPtr[i]);
	free(mainPtr);
	return 0;
}

题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 11 到nn。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。

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

输入输出格式
输入格式:
输入共n+2n+2行

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

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

第n+2n+2行包含两个正整数xx和yy,表示所求的地面的点的坐标(x,y)(x,y)
输出格式:
输出共11行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1−1

输入输出样例
输入样例#1: 复制
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2
输出样例#1: 复制
3

输入样例#2: 复制
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5
输出样例#2: 复制
-1
说明
【样例解释1】

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

【数据范围】

对于30% 的数据,有 n ≤2n≤2 ;
对于50% 的数据,0 ≤a, b, g, k≤1000≤a,b,g,k≤100;
对于100%的数据,有 0 ≤n ≤10,0000≤n≤10,000 ,0≤a, b, g, k ≤100,0000≤a,b,g,k≤100,000。

noip2011提高组day1第1题

猜你喜欢

转载自blog.csdn.net/weixin_43873801/article/details/86541195
今日推荐