2024HBCPC:E Breakfast II

题目描述

作为一个合格的大学生,你不仅需要学习成绩好,还需要会买包子和鸡蛋。 今天,又轮到你们给你的导师买早饭了! 这一次你们一共需要给导师买 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于vuestic-ui实战教程 - 页面篇

1. 简介 前面介绍了基本的内容比如如何获取动态数据&#xff0c;下面就到登录进来后的页面实现了&#xff0c;相信各位读者或多或少都有 element-uijs 的实战经历&#xff0c;那么 vuestic-uits 实现的页面又该如何写呢&#xff1f;带着疑问开启今天的学习&#xff08;声明由于…

开源VS闭源:谁将引领AI大模型的新时代?

一、引言 随着人工智能技术的飞速发展&#xff0c;AI大模型已成为推动这一浪潮的核心动力。在AI大模型的发展过程中&#xff0c;开源与闭源两种不同的发展路径一直备受关注。本文将深入探讨这两种路径的优劣势&#xff0c;分析它们对AI大模型发展的影响&#xff0c;并预测谁将…

采用java语言+B/S架构+后端SpringBoot前端Vue开发的ADR药品不良反应智能监测系统源码

采用java语言&#xff0b;B/S架构&#xff0b;后端SpringBoot前端Vue开发的ADR药品不良反应智能监测系统源码 ADR监测引擎每日主动获取检验数据、病历内容&#xff08;可拓展&#xff09;、以及其他临床数据&#xff0c;根据知识库内容自动判定患者是否有不良反应迹象&#xf…

Mesa软件框架以及重要数据结构分析

Mesa软件框架以及重要数据结构分析 引言 Mesa的实现比较复杂&#xff0c;其中还有许多的数据结构之间的关系逻辑还不是很清楚。感觉分析了又没有分析一样&#xff0c;这里我们再理一理&#xff01; 1.1 Mesa下EGL/GL核心数据结构和层级关系 MESA的核心数据结构很多很复杂&#…

【CSDN独家公开】Python解析.SchDoc格式文件转换为json文件

前情提要 因工作需求&#xff0c;需要解析.SchDoc格式文件&#xff0c;提取文本和位置关系&#xff0c;通常方式是转换为图片或PDF&#xff0c;再进行OCR&#xff0c;但是这样识别精度太低了 Github找了好些项目&#xff0c;都不支持 PyAltium不支持 https://github.com/plu…

每日一题 <leetcode--2326.螺旋矩阵>

https://leetcode.cn/problems/spiral-matrix-iv/ 函数中给出的int* returnSize和int** returnColumnSizes是需要我们返回数值的&#xff0c;这点需要注意。其中int** returnColumnSizes 是需要额外开辟一块空间。 这道题我们首先需要malloc出一快空间来把链表存放在数组中&…

元宇宙vr美术虚拟展馆激发更多文化认同和互鉴

科技引领创新潮流&#xff0c;借助前沿的Web3D技术&#xff0c;我们为用户打造了一个沉浸式的纯3D虚拟空间体验平台&#xff1a;元宇宙线上互动展厅。您只需通过网页即可轻松访问这个充满未来感的互动平台。 在这个独特的虚拟环境中&#xff0c;用户可以轻松创建个性化角色&…

Android 13 sysprop_library新增属性

前提 我们在androidP及之前的版本&#xff0c;平台侧及应用层开发习惯于通过调用&#xff08;或者反射&#xff09;SystemProperties系统API的方式进行系统属性的读写。Android R以后&#xff0c;平台侧代码采用了一种将系统属性封装成类方法的形式供开发者调用。 Android R以…

I.MX6ULL模仿 STM32 驱动开发格式实验

系列文章目录 I.MX6ULL模仿 STM32 驱动开发格式实验 I.MX6ULL模仿 STM32 驱动开发格式实验 系列文章目录一、前言二、模仿 STM32 寄存器定义2.1 STM32 寄存器定义简介2.2 I.MX6Ul 寄存器定义2.3硬件原理图2.4实验程序编写 三、编译下载验证 一、前言 使用 C 语言编写 LED 灯驱…

深度学习——自己的训练集——图像分类(CNN)

图像分类 1.导入必要的库2.指定图像和标签文件夹路径3.获取文件夹内的所有图像文件名4.获取classes.txt文件中的所有标签5.初始化一个字典来存储图片名和对应的标签6.遍历每个图片名的.txt文件7.随机选择一张图片进行展示8.构建图像的完整路径9.加载图像10.检查图像是否为空 随…

消息队列实战应用

适用场景 耗时长&#xff0c;非核心业务&#xff0c;生产者不会用到消息处理结果的情况下&#xff0c;可以将消息交给异步服务去缓存与消费 部署MQ服务 version: "3.0" services:rabbitmq:container_name: rabbitmq-15672-1image: rabbitmq:3-managementports:- &…

短视频再度重逢:四川京之华锦信息技术公司

短视频再度重逢 在数字化时代的浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为现代人生活中不可或缺的一部分。而当我们谈论起短视频&#xff0c;我们不仅仅是在谈论一种娱乐方式&#xff0c;更是在谈论一种情感的载体&#xff0c;一种回忆的媒介。今天&…

【ai】LiveKit Agent 的example及python本地开发模式工程实例

title: ‘LiveKit Agent Playground’ playgroundLiveKit Community playground的环境变量&#xff1a;LiveKit API # LiveKit API Configuration LIVEKIT_API_KEYYOUR_API_KEY LIVEKIT_API_SECRETYOUR_API_SECRET# Public configuration NEXT_PUBLIC_LIVEKIT_URLwss://YOUR_…

pytorch比较操作

文章目录 常用的比较操作1.torch.allclose()2.torch.argsort()3.torch.eq()4.torch.equal()5.torch.greater_equal()6.torch.gt()7.torch.isclose()8.torch.isfinite()9.torch.isif()10.torch.isposinf()11.torch.isneginf()12.torch.isnan()13.torch.kthvalue()14.torch.less_…

【从零开始学习RabbitMQ | 第二篇】如何确保MQ的可靠性和消费者可靠性

目录 前言&#xff1a; MQ可靠性&#xff1a; 数据持久化&#xff1a; Lazy Queue&#xff1a; 消费者可靠性&#xff1a; 消费者确认机制&#xff1a; 消费失败处理&#xff1a; MQ保证幂等性&#xff1a; 方法一&#xff1a; 总结&#xff1a; 前言&#xff1a; …

以梦为马,不负韶华(3)-AGI在企业服务的应用

AGI在企业服务中&#xff0c;各应⽤已覆盖企业全流程&#xff0c;包含⼈⼒、法务、财税、流程⾃动化、知识管理和软件开发各领域。 由于⼤语⾔模型对⽂本处理类场景有着天然且直接的适配性&#xff0c;⽂本总结、⽂本内容⽣成、服务指引等发展起步早且应⽤成熟度更⾼。 在数据…

Captura完全免费的电脑录屏软件

一、简介 1、Captura 是一款免费开源的电脑录屏软件&#xff0c;允许用户捕捉电脑屏幕上的任意区域、窗口、甚至是全屏画面&#xff0c;并将这些画面录制为视频文件。这款软件具有多种功能&#xff0c;例如可以设置是否显示鼠标、记录鼠标点击、键盘按键、计时器以及声音等。此…

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;它表…

医疗图像处理2023:Transformers in medical imaging: A survey

医学成像中的transformer:综述 目录 一、介绍 贡献与安排 二、CNN和Transformer 1.CNN 2.ViT 三、Transformer应用于各个领域 1.图像分割 1&#xff09;器官特异性 ①2D ②3D 2&#xff09;多器官类别 ①纯transformer ②混合架构 单尺度 多尺度 3&#xff09;…

Kubernetes——监听机制与调度约束

目录 前言 一、监听机制 1.Pod启动创建过程 2.调度过程 1.指定调度节点 1.1强制匹配 1.2强制约束 二、硬策略和软策略 1.键值运算关系 1.硬策略——requiredDuringSchedulingIgnoredDuringExecution 2.软策略——preferredDuringSchedulingIgnoredDuringExecution …