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

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

24小时前

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提高组铺地毯题解

原创内容 转载请注明出处

分享给朋友:

相关文章

洛谷2804题解:基于Fenwick树与离散化的区间统计优化方案

洛谷2804题解:基于Fenwick树与离散化的区间统计优化方案

一、题目解读洛谷2804题要求解决一个涉及区间统计的问题,核心在于高效计算满足特定条件的元素数量。题目可能涉及前缀和、区间查询或计数类操作,需处理大范围数据及可能的负数输入。通过代码分析可知,关键需求...

2017年 NOIP 提高组 逛公园(洛谷P3953)题解:代码解析与优化

2017年 NOIP 提高组 逛公园(洛谷P3953)题解:代码解析与优化

一、题目解读    2017年NOIP提高组“逛公园”题目(洛谷P3953)要求在有向图中计算从起点到终点满足特定条件的路径数量。题目难点在于处理路径长度限制与...

2022 CSP-J 上升点序(洛谷P8816)解题报告:动态规划求解最长上升序列

2022 CSP-J 上升点序(洛谷P8816)解题报告:动态规划求解最长上升序列

一、题目解读2022年CSP-J题目“上升点序”(洛谷P8816)要求给定一个平面点集,每个点的坐标(x,y)均为整数。题目需要构造一个最长的上升序列,序列中相邻点的坐标满足x和y均严格递增。允许使用...

NOIP 2013提高组积木大赛(洛谷P1969)题解:贪心算法优化与代码解析

NOIP 2013提高组积木大赛(洛谷P1969)题解:贪心算法优化与代码解析

一、题目解读2013年NOIP提高组“积木大赛”(洛谷P1969)要求处理积木堆叠问题。题目给定n个积木高度,需计算按特定规则堆叠后的总高度差。核心在于识别上升序列的累积增量,而非简单求和。二、解题思...

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

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

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

发表评论

访客

看不清,换一张

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