洛谷 P1003 讲解(C++)

传送门

目录

        思路:

        代码:


思路:

        首先,在看到这道题时,最直观的想法就是开一个二维数组,每次遍历一张地毯,并更新二

维数组。

        但是,细心的读者肯定发现,这道题 a,b,g,k的最大值小于10^5。也就是说,二维数组的

x,y的最大值为 2*10^5 ,二维数组的大小就是 4*10^10 ,喜提MLE。

        我们不妨换一个思路,先将 a,b,g,k 储存起来,最后在一个个遍历。如果 x,y 在这个地

毯范围內,更新答案。最后在输出答案。

        经过计算,代码的时间复杂度是O(n),最坏遍历次数约为为10^4,不会 TLE,空间复杂度

为O(n),空间为10^4,不会 MLE。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+9; //定义常量maxn为数组大小 
int a[maxn],b[maxn],c[maxn],d[maxn]; //储存a,b,g,k 
int main(){
	//定义n(地毯个数),x,y(位置),ans(储存答案,定义为-1,默认无地毯覆盖(x,y))
	int n,x,y,ans=-1; 
	cin>>n; //输入地毯个数 
	for(int i=1;i<=n;i++){ //循环 
		//输入地毯左下角位置和地毯在x轴和y轴方向的长度并存储 
		cin>>a[i]>>b[i]>>c[i]>>d[i]; 
	}
	cin>>x>>y; //输入查询位置 
	for(int i=1;i<=n;i++){ //遍历所有地毯 
		//定义地毯x最大值和y最大值(左下角位置加上x轴或y轴方向的长度即可得) 
		int maxx=a[i]+c[i],maxy=b[i]+d[i];
		if(x>=a[i]&&x<=maxx&&y>=b[i]&&y<=maxy){ //判断是否在区间内 
			ans=i; //更新答案 
		}
	}
	cout<<ans; //输出答案(如果无地毯覆盖则输出-1) 
	return 0;
} 

  附:这是我第一次写题解,如果有缺点,可以在评论区指出来,谢谢!

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值