洛谷P1003

洛谷P1003

题目大意

简而言之就是在坐标轴上铺地毯,根据输入的坐标将地毯放在坐标轴上,然后最后给出一个坐标,找到铺在这个坐标上最上面的地毯编号

Train of thought

首先我们应该找到每个矩阵对应包含的范围,这样我们才能去寻找目标点最上方的矩阵
这里我们采用枚举的方式,创建一个结构体,其包含的是对应矩阵的范围

struct Matrix{
    int x1,x2;
    int y1,y2;
};

遍历整个数组,如果发现目标点在矩阵范围内,就把对应得编号记下来

Time complexity

输入最多需要104,每次输入处理两次,然后遍历整个数组一次,每次遍历比较一次,总的时间复杂度大概为2*104 + 10 ^4,就是0(n)

综上所述,代码如下:

#include<iostream>
#include<utility>
#include<vector>
using namespace std;
typedef long long ll;
#define fi(a,b) for(int i = a; i <= b; ++i)
#define fr(a,b) for(int i = a; i >= b; --i)
using pii = pair<int,int>;
struct Matrix{
    int x1,x2;
    int y1,y2;
};
vector<Matrix> vec;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
while(n--)
{
    Matrix temp;
    cin >> temp.x1 >> temp.y1;
    int q,w;
    cin >> q >> w;
    temp.x2 = temp.x1 + q;
    temp.y2 = temp.y1 + w;
    vec.push_back(temp);
}//处理范围
int r,w;
cin >> r >> w;
int result = -1;
fi(0,vec.size()-1)
{
    if(vec[i].x1 <= r && r <= vec[i].x2 && w >= vec[i].y1 && w <= vec[i].y2)
        result = i;//如果满足条件,就记下对应得编号
}
result++;//因为编号是从0开始,所以最后要加一
if(result == 0)
cout << "-1" << endl;
else
cout << result << endl;
return 0;
}

优化:

考虑从后往前遍历,遇到满足条件的就直接跳出,这样可以有效地降低时间复杂度


感谢大家的阅读,如果觉得还不错就点个赞吧ヾ(≧▽≦*)o

posted @ 2021-09-13 18:42  Sun-Wind  阅读(66)  评论(0编辑  收藏  举报