放物资(铺地毯问题)

题目

问题背景:
爆发于武汉的新型冠状病毒感染的肺炎疫情牵动着全国各地人民的心,一方有难,八方支援。截至目前,山东寿光向武汉捐赠蔬菜已达1120吨;俄罗斯中国总商会组织在俄企业、华人华侨捐赠各类防护用品约15吨;直升机空降新华路体育场,解武汉协和医院燃眉之急……大批捐赠物资的管理存放是个大问题。一旦处理不好劳民伤财不说,还会寒了广大爱心人士的心。
问题描述:
现在有一块边长为n的正方形空场地用来存放物资,场地被分割成一个个边长为1的方形小区域。一共有m批物资需要存放,编号为1—m,工作人员按编号顺序依次存放这m批物资,每一批物资需要选定一个矩形区域存放。若选定的矩形区域中,某个方形小区域已经有物资,则将本批物资摞到该方形小区域的最上面。你的任务是查询某个方形小区域最上面的物资属于第几批,若无物资输出0。
注:本题时间限制1s,空间限制256MB(此处最后面有解释与提示)
俯视图:

输入描述:
第1行2个整数n和m
接下来m行,每行四个整数x1,y1,x2,y2,分别表示这批物资选定的矩形区域的左上角是第x1行y1列,右下角是第x2行y2列
接下来1行2个整数x和y,表示要查询的方形小区域是第x行y列
输出描述:
1个整数

样例输入:
10 5
1 1 3 3
4 3 6 8
8 9 10 10
4 4 5 5
2 4 7 4
5 4

样例输出:
5
数据范围:
范围一:1<=n,m,x1,y1,x2,y2<=1000
范围二:1<=n,m,x1,y1,x2,y2<=1000000

解释与提示:
一、时间限制1s:竞赛中粗略认为1s可支撑1亿次运算。
1、for(i=1;i<=10;++i) a++; 该代码可以粗略的认为进行了10次运算
2、for(i=1;i<=1000000;++i)
for(j=1;j<=10000000;++j)
a[i][j]++; 该代码可以粗略的认为进行了1万亿次运算
二、空间限制256MB:此处只粗略计算数组大小。1个int型变量是4B,那么1个10001000的二维数组所占空间:100010004/1024/1024=3.81MB。1个10000001000000的二维数组所占空间:3814697.27MB

分析

第一次看到这种题的时候,我就是用解释2里的方法来做的,因为时间和空间限制,所以总是过不了。因此,我们不需要知道所有坐标所代表的数值是多少,我们只要知道,从最上面的物资开始搜索,我们输入的x,y是否在物资所在的范围内。

代码

#include<iostream>
#include<cstdio>


using namespace std;
int a[1001],b[1001],c[1001],d[1001];
int main()
{
	int n,m,i;
	int x,y;
	cin>>n>>m;
	for(i=1;i<=m;i++)
	{
		cin>>a[i]>>b[i]>>c[i]>>d[i];
		
	}
	cin>>x>>y;
	for(i=m;i>=1;i--)
	{
		if((x>=a[i]&&x<=c[i])&&(y>=b[i]&&y<=d[i]))
		{
			break;
		}
	}
	cout<<i<<endl;
	
	return 0;
 } 

结果

在这里插入图片描述
一定要注意时间限制和空间限制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值