洛谷P1003 [NOIP2011 提高组] 铺地毯

铺地毯

该题目对时间复杂度要求较高,使用一般的双层循环构造成的二维数组会导致超时
如图,除第一行与最后一行,其余每行都分别代表这此地毯的坐标和长宽,
可将第1行和倒数第1行之间的部分抽象成一个二维数组,可将该数组进行录入和稍加调整
如图有abcd四点,令图中的c=c+a,d=d+bc,d为宽度或长度,即a+c为地毯区域中x的最大值,b+d为区域中y的最大值
a<= x <=c+a , b<= y <=d+b
此时靠a,b,c,d便可以明确的划分出该层地毯的范围
在这里插入图片描述


#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,i;
	cin >> n;
	int a[10000][5]; 
	for (int i=1;i<=n;i++)//将n个地毯的范围值分别录入 
	{
		cin >> a[i][1] >>a[i][2] >>a[i][3] >>a[i][4];
		a[i][3]+=a[i][1];
		a[i][4]+=a[i][2];
	}
	int xi,yi;
	cin >> xi >> yi;
	for (i=n;i>0;i--)//检查最终输入的点是否在第n个地毯上,由于第n个地毯最后叠放上去,故先从第n个地毯开始检查 
	{
		if(xi>=a[i][1]&&xi<=a[i][3]&&yi>=a[i][2]&&yi<=a[i][4])
		{
			cout << i;break;
		}
	}
	if(i==0) cout << -1;//i=0说明遍历一轮了还没有找到(xi,yi)的位置返回-1 
	return 0;	
}




  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值