CSP-阴阳龙 满分题解(从15分debug到100的心路历程)

题目回顾:

阴阳龙icon-default.png?t=N7T8https://sim.csp.thusaac.com/contest/31/problem/3

C++满分题解

思路概述

        从输入到输出,整理逻辑为:

        接下来设计数据结构:

        首先需要一个结构来存放员工和阴阳龙位置:

struct location {
    long long x;      //横坐标
    long long y;      //纵坐标
    int pID;          //员工编号,阴阳龙编号为0

    location(long long x = 0, long long y = 0, int pID = 0) {
        this->pID = pID;
        this->x = x;
        this->y = y;
    }

};

        求解k时,刚开始我朴素的定义了一个函数来计算两个location之间的距离:

long long l_distance(location l1, location l2){
    if(l1.x==l2.x)                                 //在x轴方向
        return abs(l1.y-l2.y)==0? 1e10:abs(l1.y-l2.y);
    else if(l1.y==l2.y)                            //在y轴方向
        return abs(l1.x-l2.x);
    else if(abs(l1.x-l2.x) == abs(l1.y-l2.y))      //在对角线方向
        return abs(l1.x-l2.x);
    else return 1e10;
}

        于是,我朴素的进行如下操作求解,这样一套操作完成,时间复杂度为: O(pq) 

#伪代码
1. 输入,初始化地图和人员
2. 阴阳龙开始刷新

        3. 计算阴阳龙刷新位置到所有人员的最短距离 (d1)

        4. 计算阴阳龙到边界的最短距离 (d2)
        5. k = d1<d2 ? d1:0
        6. 更新人员
7. 计算最终结果
end

        提交之后发现只通过了用例2,剩下的都是运行超时(用例2的q最小)。

       于是开始改进。可以发现,在计算阴阳龙刷新位置到人员的最短距离时,并不是所有的人员都需要参与计算,只需要考虑八个方向上的点即可,这是简化之一。同时,在查找一个方向(数轴)上距离某位置最近的左右两侧的点时,进行二分查找可以将时间复杂度降低,这是简化之二:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值