其他分享
首页 > 其他分享> > HDU-4341 Gold miner 题解

HDU-4341 Gold miner 题解

作者:互联网

题目大意

黄金矿工的游戏,不过每个金块可以看做是质点,没有大小,给出每个金块的坐标、抓取所花费的时间(包括返回的时间),以及价值,其中有一些金块可能会共线。求在规定时间内所获得的最大价值。

样例

样例输入 1

3 10
1 1 1 1
2 2 2 2
1 3 15 9

样例输出 1

3

样例 1 说明

1和2共线,同时抓取价值最大

样例输入2

3 10
1 1 13 1
2 2 2 2
1 3 4 7

样例输出2

7

样例 2 说明

1和2共线,抓2必须先抓1,时间不够,因此只抓3最优。

分析

代码

// 对所有的gold进行分组,重新计算价值和时间
void Divide() {
    for (int i = 0; i <= n; ++i) a[i][0] = 0;
    sort(g+1, g+1+n);
    a[1][0] = 1;
    a[1][1] = 1;
    g[1].id = 1;
    line = 1; // 保存组数
    
    for (int i = 2; i <= n; ++i) {
        Gold &now = g[i];
        bool found = false;
        for (int j = i-1; j > 0; --j) {
            Gold &last = g[j];
            if (now.x * last.y == now.y * last.x) { // 共线
                now.id = last.id;
                now.t += last.t;
                now.val += last.val;
                a[now.id][++a[now.id][0]] = i;
                found = true;
                break;
            }
        }
        if (!found) { // 如果没有共线,单独分一组
            ++line;
            a[line][0] = 1;
            a[line][1] = i;
            now.id = line;
        }
    }
}

剩下就是跑分组背包了,没啥可写的了

标签:HDU,last,金块,题解,miner,共线,样例,now,id
来源: https://www.cnblogs.com/kuangbiaopilihu/p/12107770.html