第4个点死活不过 蒟蒻求助
查看原帖
第4个点死活不过 蒟蒻求助
583610
DrAlfred楼主2022/9/25 08:21
#include <bits/stdc++.h>
using namespace std;
struct PeanutNode {
    int x, y, PeanutSum;
    PeanutNode() {
        x = y = PeanutSum = 0;
    }
    PeanutNode(int _x, int _y, int sum) {
        x = _x;
        y = _y;
        PeanutSum = sum;
    }
    inline const bool operator<(const PeanutNode _ano) const {
        return PeanutSum < _ano.PeanutSum;
        // 给priority_queue 中的less<PeanutNode> 调用
    }
};
int m, n, k, p, ans = 0;
priority_queue<PeanutNode> pq;
inline int distance(PeanutNode a, PeanutNode b) {
    return abs(a.x - b.x) + abs(a.y - b.y); // 计算曼哈顿距离
} 
inline void solve(PeanutNode lastNode, int restTime) {
    // 计算走到和采摘当前点(pq.top())所需的时间
    int requireTime = distance(lastNode, pq.top()) + 1;
    // 假如采完了回到路边还能有多余的时间(可以采摘)
    if (requireTime + pq.top().x <= restTime) {
        PeanutNode next = pq.top();
        pq.pop();               // 采摘并且前往下一个点
        restTime -= requireTime;
        ans += next.PeanutSum;
        solve(next, restTime);
    }
}
int main(int argc, char const *argv[]) {
    scanf("%d%d%d", &m, &n, &k);
    for (int i = 1; i <= m;i++) {
        for (int j = 1; j <= n;j++) {
            scanf("%d", &p);
            if (p) {
                // 只把有花生的点加入优先队列
                pq.push(PeanutNode(i, j, p));
            }
        }
    }
    solve(PeanutNode(0, pq.top().y, 0), k); // 计算ans
    // 你问为啥是这个Node? 别问 问就是最短距离
    // (其实也就是从路上到达这个点的距离) 路的x为0
    printf("%d\n", ans);
    system("pause");
    return 0;
}

2022/9/25 08:21
加载中...