2024HBCPC:E Breakfast II

news2024/10/7 10:19:26
题目描述

作为一个合格的大学生,你不仅需要学习成绩好,还需要会买包子和鸡蛋。 今天,又轮到你们给你的导师买早饭了! 这一次你们一共需要给导师买 n n n 个包子和 m m m 个鸡蛋(请注意,这一次可能不再只买 32 32 32 个包子和 20 20 20 个鸡蛋)。 你的大学可以看作一个二维平面上 1 0 4 × 1 0 4 10^4×10^4 104×104 的正方形,横纵坐标的范围均为 0 ∼ 1 0 4 0∼10^4 0104。学校内一共有 3 3 3 间食堂,分别叫做综合食堂风味餐厅学生食堂。为了防止一个人买太多的早饭,每个人在每间食堂买的包子数和鸡蛋数分别不能超过 b b b e e e。 你们一共有 k k k 个人,第 i i i 个人所在宿舍的坐标为 ( X i , Y i ) (X_i,Y_i) (Xi,Yi)。你们需要选出若干同学,这些同学从各自的宿舍出发,前往食堂购买早饭后,然后将至少 n n n 个包子和 m m m 个鸡蛋送到导师的办公室。请注意,对于每位同学,每个食堂最多只能去购买一次。 你们需要进行商量,并决定哪些同学去买早饭、每个同学去哪些食堂、以及这些同学的路线,使得所有同学路线长度之和最小。如果某位同学无需购买早饭,那么他将待在宿舍里而不用前往办公室。

Input

第一行 3 3 3 个由空格分隔的整数 n , m , k ( 1 ≤ n , m , k ≤ 1 0 3 ) n,m,k (1≤n,m,k≤10^3) n,m,k(1n,m,k103),分别表示需要的包子数、鸡蛋数和学生个数。 第二行 2 2 2 个由空格分隔的整数 b , e ( 1 ≤ b ≤ n , 1 ≤ e ≤ m ) b,e (1≤b≤n,1≤e≤m) b,e(1bn,1em),分别表示每个人在每间食堂可以购买的包子与鸡蛋的上限。 第 3 ∼ 6 3∼6 36 行,每行两个由空格分隔的非负整数 x , y ( 0 ≤ x , y ≤ 104 ) x,y (0≤x,y≤104) x,y(0x,y104),依次表示综合食堂风味餐厅学生食堂办公室的坐标。 接下来 k k k 行,每行两个由空格分隔的非负整数 X i , Y i ( 0 ≤ X i , Y i ≤ 1 0 4 ) X_i,Y_i (0≤X_i,Y_i≤10^4) Xi,Yi(0Xi,Yi104),表示每位同学宿舍的坐标。 保证所有坐标互不相同,输入保证一定存在至少一种合法的买早饭方案

Output

一行一个浮点数,表示最小的路线长度之和。你的答案将被认为是正确的当且仅当与标准答案的相对或绝对误差不超过 1 0 − 6 10^{−6} 106

输入样例1
32 20 2
14 15
2 2
4 8
8 4
6 2
2 8
7 7
输出样例1
16.4759861592
输入样例2
32 20 2
32 20
2 2
4 8
8 4
6 2
2 8
7 7
输出样例2
5.9907047849
提示

对于样例一,最短的路线如图所示(其中 A , B , C A,B,C A,B,C 表示三个食堂, D D D 表示办公室, S 1 , S 2 S1,S2 S1,S2 表示学生的位置):
note.png

解题思路

分析题目可以得知,可以通过所需购买的包子和鸡蛋的个数推算出至少需要去食堂 m x = m a x ( ⌈ n b ⌉ , ⌈ m e ⌉ ) mx=max(\lceil \frac{n}{b} \rceil, \lceil \frac{m}{e} \rceil) mx=max(⌈bn,em⌉)次,每个学生之间也相互独立,所以考虑动态规划 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 考虑前 i i i 个学生,去了 j j j 次食堂所需的最短距离,问题就转换成了一个很经典的背包模型了。
在这里插入图片描述
其中, s [ i ] s[i] s[i] 维护的是第 i i i 个学生的信息,比如 s [ i ] . a s[i].a s[i].a 是经过综合食堂去办公室的最短距离, s [ i ] . a b s[i].ab s[i].ab 则是经过综合食堂,风味餐厅这两个食堂再去办公室的最短距离。

实现代码
#pragma GCC optimize(3, "Ofast", "inline")
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define debug(x) cerr << #x" = " << x << '\n';
using namespace std;

void solve()
{
    int n, m, k, b, e;
    cin >> n >> m >> k >> b >> e;
    vector<pair<int, int>> D(4);
    for (int i = 0; i < 4; i++) cin >> D[i].x >> D[i].y;
    struct node
    {
        int x, y;
        double a, b, c, ab, ac, bc, abc;
    };
    vector<node> s(k + 10);
    auto get= [](int x1, int y1, int x2, int y2)
    {
        double dx = x1 - x2;
        double dy = y1 - y2;
        return sqrt(dx * dx + dy * dy);
    };

    double at = get(D[0].x, D[0].y, D[3].x, D[3].y);
    double bt = get(D[1].x, D[1].y, D[3].x, D[3].y);
    double ct = get(D[2].x, D[2].y, D[3].x, D[3].y);

    double ab = get(D[0].x, D[0].y, D[1].x, D[1].y);
    double ac = get(D[0].x, D[0].y, D[2].x, D[2].y);
    double bc = get(D[1].x, D[1].y, D[2].x, D[2].y);

    for (int i = 1; i <= k; i++)
    {
        cin >> s[i].x >> s[i].y;

        double a = get(s[i].x, s[i].y, D[0].x, D[0].y);
        double b = get(s[i].x, s[i].y, D[1].x, D[1].y);
        double c = get(s[i].x, s[i].y, D[2].x, D[2].y);

        s[i].a = a + at;
        s[i].b = b + bt;
        s[i].c = c + ct;

        s[i].ab = a + ab + bt;
        s[i].ab = min(s[i].ab, b + ab + at);

        s[i].ac = a + ac + ct;
        s[i].ac = min(s[i].ac, c + ac + at);

        s[i].bc = b + bc + ct;
        s[i].bc = min(s[i].bc, c + bc + bt);
        
        s[i].abc = a + ab + bc + ct;
        s[i].abc = min(s[i].abc, a + ac + bc + bt);
        s[i].abc = min(s[i].abc, b + ab + ac + ct);
        s[i].abc = min(s[i].abc, b + bc + ac + at);
        s[i].abc = min(s[i].abc, c + ac + ab + bt);
        s[i].abc = min(s[i].abc, c + bc + ab + at);
    }

    int mx = (n + b - 1) / b;
    mx = max(mx, (m + e - 1) / e);
    vector<vector<double>> dp(k + 10, vector<double>(mx + 10, 1e18));
    for (int i = 0; i <= k; i++) dp[i][0] = 0;
    for (int i = 1; i <= k; i++)
    {
        for (int j = 0; j <= mx; j++)
        {
            dp[i][j] = dp[i - 1][j];
            if (j >= 1) dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + min(s[i].a, min(s[i].b, s[i].c)));
            if (j >= 2) dp[i][j] = min(dp[i][j], dp[i - 1][j - 2] + min(s[i].ab, min(s[i].ac, s[i].bc)));
            if (j >= 3) dp[i][j] = min(dp[i][j], dp[i - 1][j - 3] + s[i].abc);
        }
    }
    cout << fixed << setprecision(10) << dp[k][mx] << '\n';
}

signed main()
{
    // freopen("Sample.in", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    // cin >> T;
    while (T--) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【class18】人工智能初步----语音识别(4)

【class17】 上节课&#xff0c;我们学习了: 语音端点检测的相关概念&#xff0c;并通过代码切分和保存了音频。 本节课&#xff0c;我们将学习这些知识点&#xff1a;1. 序列到序列模型2. 循环神经网络3. 调用短语音识别接口 知其然&#xff0c;知其所以然 在调用语…

JS——对象

1.什么是对象 对象是什么&#xff1f; 对象是一种数据类型 无序的数据的集合&#xff08; 数组是有序的数据集合 &#xff09; 对象有什么特点&#xff1f; 无序的数据的集合 可以详细地描述某个事物 静态特征 (姓名, 年龄, 身高, 性别, 爱好) > 可以使用数字, 字符串…

数据结构算法题day03

数据结构算法题day03 题目 题目 2.设计一个高效算法&#xff0c;将顺序表L的所有元素逆置&#xff0c;要求算法的空间复杂度为O(1)算法思想&#xff1a; 1、常规的解法&#xff1a; Void reverse (sqlist &L){Elemtype temp; //辅助变量for(i 0,i < L.length; i){temp…

985上交应届生转正12天,被某东辞退了!

&#x1f447;我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299&#xff0c;限时特价2杯咖啡&#xff0c;满100人涨10元。 01.事情起源 最近粉丝群都在转发一个截图&#xff0c;某应届毕业生在某东实习一年&#xff0c;才转正才12天&#xff0c;就因为自己调侃…

kafka-消费者组-发布订阅测试

文章目录 1、发布订阅测试1.1、创建消费者4并指定组 my_group21.2、列出所有的消费者组1.3、查看 my_group2 组的详细信息1.4、发送第六条消息accomplish1.4.1、查看 my_group1 组的详细信息1.4.2、查看 my_group2 组的详细信息 1、发布订阅测试 接着上一篇点对点博客测试 kafk…

【RabbitMQ】使用SpringAMQP的Publish/Subscribe(发布/订阅)

Publish/Subscribe **发布(Publish)、订阅(Subscribe)&#xff1a;**允许将同一个消息发送给多个消费者 **注意&#xff1a;**exchange负责消息路由&#xff0c;而不是存储&#xff0c;路由失败则消息丢失 常见的**X(exchange–交换机)***类型&#xff1a; Fanout 广播Direc…

小白怎么看DDR

有做和参与这么些芯片 虽说每每是片上系统 但是DDR是个远观 没近看的 它们说DRAM长这样 SRAM长这样 可见SRAM更复杂 但是DRAM的控制就不简单了

Web3革命:探索科技与物联网的无限可能

引言 Web3时代正在悄然而至&#xff0c;带来了对互联网的彻底颠覆和改变。作为互联网的下一代&#xff0c;Web3不仅是技术革新的延续&#xff0c;更是对传统互联网模式的重新构想。在这个新时代&#xff0c;科技与物联网的结合将迎来无限的可能性&#xff0c;将探索到一片全新…

CLIP部署:在Ubuntu配置环境

前置背景&#xff1a; 需求是把CLIP模型在实验室Ubuntu服务器上配置环境&#xff0c;有一个老师给的账号和密码&#xff0c;用mobaXterm可以连接上服务器。 首先&#xff0c;需要在自己的文件夹里面下载Anaconda&#xff0c;因为我的账户里面别人已经下过了&#xff0c;所以&am…

Vue3项目练习详细步骤(第一部分:项目构建,登录注册页面)

项目环境准备 工程创建 安装依赖 项目调整 注册功能 页面结构 接口文档 数据绑定和校验 数据接口调用 解决跨域问题 登录功能 接口文档 数据绑定和校验 数据接口调用 优化登录/注册成功提示框 项目演示 项目的后端接口参考&#xff1a;https://blog.csdn.net/daf…

太阳能语音监控杆(球机LED款)有什么用

传统监控设备依赖电力支持&#xff0c;在偏远地区和没有网络地区难以发挥其作用&#xff0c;而鼎跃安全的太阳能语音监控杆&#xff08;球机LED款&#xff09;在传统监控基础上&#xff0c;进行了全面优化&#xff0c;解决了无电无网区域使用受限的问题。 太阳能语音监控杆&am…

Postgresql源码(134)优化器针对volatile函数的排序优化分析

相关 《Postgresql源码&#xff08;133&#xff09;优化器动态规划生成连接路径的实例分析》 上一篇对路径的生成进行了分析&#xff0c;通过make_one_rel最终拿到了一个带着路径的RelOptInfo。本篇针对带volatile函数的排序场景继续分析subquery_planner的后续流程。 subquer…

LeetCode题练习与总结:有序链表转换二叉搜索树--109

一、题目描述 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为平衡二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0&#xff0c;-3,9&#xff0c;-10,null,5]&#xff0c;它表…

eBPF可观测之网络流量控制和管理traffic control浅尝

目录 工程背景 环境准备 安装工具​​​ 安装依赖包 安装C依赖库 操作步骤 目录结构 代码展示 效果展示 拓展提升 工程背景 首先发表一个"暴论" eBPF在可观测方面的应用&#xff0c;就是各种google。 不需要学习内核&#xff0c;只要掌握ebpf开发套路。…

3D应用开发工具HOOPS如何优化复杂3D大模型的实时渲染和交互?

在现代工程设计、仿真和可视化领域&#xff0c;处理和交互大型三维模型&#xff08;3D Models&#xff09;的需求日益增加。随着模型复杂度和数据量的增长&#xff0c;如何有效地管理和实时操作这些模型成为了一个关键挑战。HOOPS技术以其卓越的速度和效率&#xff0c;成为了应…

java项目——图书管理系统

文章目录 前言图书管理系统整体框架&#xff1a;book包user包Main包&#xff1a;iooperation包总结&#xff1a; 前言 针对这些天所学的javaSE的知识&#xff0c;用一个小项目来实践一下。 图书管理系统 整体框架&#xff1a; 采取面向对象的思想实现此项目&#xff0c;首先…

SALOME源码分析:MDF框架

SALOME是由EDF、CEA、Open CASCADE等联合开发的开源CAE集成平台。 作为一款开源CAE软件集成平台&#xff0c;SALOME以其现代化的架构设计、良好的扩展性&#xff0c;提供了几何建模、网格生成、数据同化、求解器调用、后处理可视化、流程管理、作业管理等方面的支持。而这一切…

Shell编程中的循环语句和函数

一、for循环语句 当面对各种列表重复任务时&#xff0c;使用简单的if语句已经难以满足需求&#xff0c;这时就需要for循环语句。for语句的结构为&#xff1a; for 变量 in 取值列表 do 命令序列 done 使用for循环语句时&#xff0c;需要指定一个变量及取值列表&#xff0c;针对…

B站pink老师HTML5基础(一)

文章目录 一、网页1.什么是网页2.什么是HTML二、常用浏览器 三、Web标准四、HTML标签1.HTML基本结构标签 五、快捷键六、常用标签1.标题标签2.段落和换行标签3.文本格式化标签4.div标签和span标签5.图像标签6.图像路径7.超链接标签8.特殊字符 一、网页 1.什么是网页 2.什么是H…

【Postman接口测试】第二节.Postman界面功能介绍(上)

文章目录 前言一、Postman前言介绍二、Postman界面导航说明三、使用Postman发送第一个请求四、Postman 基础功能介绍 4.1 常见类型的接口请求 4.1.1 查询参数的接口请求 4.1.2 表单类型的接口请求 4.1.3 上传文件的表单请求 4.1.4 JSON 类…