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

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

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

原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

2025年蓝桥杯省赛A组抽奖题(洛谷P12140)解析:代码思路与解题步骤详解

2025年蓝桥杯省赛A组抽奖题(洛谷P12140)解析:代码思路与解题步骤详解

一、题目解读2025年蓝桥杯省赛A组中的“抽奖”题目(对应洛谷P12140)要求处理三个转轮抽奖机制。每个转轮有n个数字,通过m次操作转动转轮,每次根据三个转轮对齐的数字组合计算得分。题目需判断三种奖...

2002年NOIP提高组 字串变换 解题报告:广度优先搜索与哈希表优化(洛谷P1032)

2002年NOIP提高组 字串变换 解题报告:广度优先搜索与哈希表优化(洛谷P1032)

一、题目解读“字串变换”问题要求将字符串A通过一系列规则变换为B,每次变换可替换A中某个子串为指定目标串,输出最少变换步数或“NO ANSWER!”。题目关键在于高效搜索所有可能的变换路径,并避免重复...

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,每次路径可取走经...

发表评论

访客

看不清,换一张

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