[洛谷]P1003 铺地毯 原创
算法标签
题目简叙
思路
我们理解一下这道题
1.参数n 总共有N个地毯 2.参数a b 表示以(a,b)为起点 3.参数g k 表示以(a,b)为起点,(a+g)X(b+k)的范围被新的地毯覆盖
我们需要理解到,不论前面的地毯姿势多么奇异,只要后面的地毯覆盖到了点(x,y)那么我们就得返回后面地毯的坐标
这种方式下,我们只需要从后往前推范围即可,从第n到第1个地毯,如果被覆盖就直接返回答案
那么,怎么判断点(x,y)是否被覆盖呢?
 首先我刚开始的时候直接想错了,我想给一个BOOL的二维数组,然后(a+g)X(b+k)直接覆盖,然后检查是否覆盖了(x,y)点
但事实上,我们可以直接依靠a b g k四个点的数据来判断
 即:(x in (range of a,a+g) && y in(range of b,b+k))
 那么我们就可以判断点(x,y)在目标范围内,逆序检查的情况下直接返回
代码
#include<iostream>
using namespace std;
const int N=1e4+10;
int n;
int a[N],b[N],g[N],k[N];
int main()
{
    cin>>n;
    
    for(int i=0;i<n;i++)cin>>a[i]>>b[i]>>g[i]>>k[i];//读入数据
    
    int x,y;x=y=0;
    int res=-1;//默认返回-1
    for(int i=n-1;i>=0;i--)
    {
        cin>>x>>y;//读入目标点
        if(x>=a[i]&&x<=a[i]+g[i]&&y>=b[i]&&y<=b[i]+k[i]){res=i+1;break;}//判定范围
    }
    cout<<res;//返回答案
    
    return 0;
}
AC截图

 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号