当前位置:首页 > 提高组 > NOIP提高组2011铺地毯题(洛谷P1003)解析与代码实现:反向遍历求解覆盖问题

NOIP提高组2011铺地毯题(洛谷P1003)解析与代码实现:反向遍历求解覆盖问题

1个月前 (08-14)

NOIP提高组2011铺地毯题(洛谷P1003)解析与代码实现:反向遍历求解覆盖问题 NOIP提高组 区间统计 算法竞赛 第1张


一、题目解读

“铺地毯”是2011年NOIP提高组的经典题目(对应洛谷P1003)。题目描述了一个平面上存在多张矩形地毯,每张地毯有左下角坐标(a,b)和宽高(g,k),给定目标点(x,y),需判断覆盖该点的最上层地毯编号(若未被覆盖则输出-1)。问题本质是二维区间查询,考验对坐标范围与覆盖顺序的理解。

二、解题思路

采用“反向遍历+范围检查”的策略:

1. 按输入顺序存储地毯数据,但从最后一张地毯开始检查(即逆序遍历);

2. 利用矩形范围判断点(x,y)是否被当前地毯覆盖(通过四个边界条件);

3. 由于地毯按铺设顺序存储,第一个覆盖目标点的地毯即为最上层,直接退出循环。

该思路巧妙利用“后铺设覆盖前铺设”的特性,避免复杂排序数据结构,时间复杂度O(n)。

三、解题步骤

4. 数据读取:使用vector存储n张地毯的(a,b,g,k)参数;

5. 目标点处理:读入查询点(x,y),初始化结果result为-1;

6. 反向查找:从n-1到0遍历地毯,若当前地毯覆盖(x,y),更新result并break;

7. 输出结果:直接输出result,完成解题。

四、代码与注释

#include <iostream>
#include <vector>
using namespace std;

struct Carpet {
    int a, b, g, k; // 左下角(a,b) + 宽g、高k
};

int main() {
    int n;
    cin >> n;          // 输入地毯数量
    vector<Carpet> carpets(n);
    
    // 读取所有地毯数据
    for (int i = 0; i < n; ++i) {
        cin >> carpets[i].a >> carpets[i].b >> carpets[i].g >> carpets[i].k;
    }
    
    int x, y;
    cin >> x >> y;     // 目标点坐标
    int result = -1;   // 初始化结果(未覆盖时为-1)
    
    // 从最后一张地毯开始反向检查
    for (int i = n - 1; i >= 0; --i) {
        // 检查点(x,y)是否在当前地毯范围内
        if (x >= carpets[i].a && x <= carpets[i].a + carpets[i].g &&
            y >= carpets[i].b && y <= carpets[i].b + carpets[i].k) {
            result = i + 1; // 地毯编号从1开始,更新结果并退出
            break;
        }
    }
    
    cout << result << endl;
    return 0;
}

五、总结

该代码通过反向遍历简化了覆盖顺序的判断,无需预处理或高级数据结构,展现了算法设计中“利用输入顺序特性”的巧妙思维。对于区间查询类问题,若数据本身隐含顺序规律,反向处理常能降低复杂度。同时,清晰的边界检查与简洁的循环结构是高效解题的关键。

参考:2011年NOIP提高组铺地毯题解

原创内容 转载请注明出处

分享给朋友:

相关文章

1999年NOIP提高组导弹拦截(洛谷P1020)解题思路与动态规划代码解析

1999年NOIP提高组导弹拦截(洛谷P1020)解题思路与动态规划代码解析

一、题目解读    1999年NOIP提高组“导弹拦截”问题(对应洛谷P1020)要求设计导弹拦截系统:给定一组导弹高度数据,需计算最少拦截系统数量,并求最多能...

2016年蓝桥杯国赛B组 机器人塔(洛谷P8644)解题全解析

2016年蓝桥杯国赛B组 机器人塔(洛谷P8644)解题全解析

一、题目解读2016年蓝桥杯国赛B组的“机器人塔”问题(洛谷P8644)是一个典型的组合数学与动态规划结合的题目。题目要求构建一个由A和B两种机器人组成的金字塔结构,其中每一层的机器人数量递减,且相邻...

2004年NOIP提高组合并果子(洛谷P1090)题解:优先队列与贪心算法的完美应用

2004年NOIP提高组合并果子(洛谷P1090)题解:优先队列与贪心算法的完美应用

一、题目解读合并果子(洛谷P1090)是2004年NOIP提高组的一道经典题目,原题链接:https://www.luogu.com.cn/problem/P1090。题目描述了一个果园场景:需要将N...

2000年NOIP提高组方格取数题解(洛谷P1004):动态规划思路解题

2000年NOIP提高组方格取数题解(洛谷P1004):动态规划思路解题

一、题目解读方格取数(洛谷P1004)是2000年NOIP提高组的经典题目:给定N×N(N≤9)的方格图,部分格子包含正整数,其余为0。需从左上角A出发,向下或向右走两次到达右下角B,每次路径可取走经...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。