zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
    

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

  • 相关阅读:
    设计模式复习笔记08
    Docker Dockerfile 指令详解与实战案例
    Docker数据管理与挂载管理
    Docker简介与安装
    Xshell如何配置并远程连接Linux服务器详解
    如何VMware创建Linux虚拟机并设置虚拟机网络
    自动化运维工具Ansible之LNMP实践环境部署
    自动化运维工具Ansible之Roles角色详解
    自动化运维工具Ansible之Tests测验详解
    Ansible Jinja2 模板使用
  • 原文地址:https://www.cnblogs.com/kuangbiaopilihu/p/12107770.html
Copyright © 2011-2022 走看看