洛谷问题买礼物和Building Roads S题解

目录

1.买礼物

2.Building Roads S


1.买礼物

P1194 买礼物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

又到了一年一度的明明生日了,明明想要买 B 样东西,巧的是,这 B 样东西价格都是 A 元。

但是,商店老板说最近有促销活动,也就是:

如果你买了第 I 样东西,再买第 J 样,那么就可以只花 KI,J​ 元,更巧的是,KI,J​ 竟然等于 KJ,I​。

现在明明想知道,他最少要花多少钱。

输入格式

第一行两个整数,A,B。

接下来 B 行,每行 B 个数,第 I 行第 J 个为KI,J​。

我们保证 KI,J​=KJ,I​ 并且 KI,I​=0。

特别的,如果KI,J​=0,那么表示这两样东西之间不会导致优惠。

注意 KI,J​ 可能大于 A。

输出格式

一个整数,为最小要花的钱数。

输入输出样例

输入 #1

1 1
0

输出 #1

1

输入 #2

3 3
0 2 4
2 0 2
4 2 0

输出 #2

7数据范围
1≤B≤500,0≤A,KI,J​≤1000

对于这题我们需要将物品看作节点,如果两个物品捆绑在一起就相当于在两个物品之间加了一条边,这个捆绑消费的价格就是这条边的权重,下面是建边操作。

for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){int x;cin>>x;if(x&&i<j)build(i,j,x);}}

当然,因为你可以捆绑购买,也可以单独购买,并且单独购买的价格是A,所以我们可以给每个物品都与0建立一个相同的边,边的权重是A,就是为了避免捆绑消费价格比单独消费还贵的情况。

	for(int i=1;i<=m;i++) build(0,i,A);

后面就是常规的边排序和Kruskal算法标准代码了。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int u,v,w;
}e[250010];
int A,m,b,ans,pre[1001];
int find(int x)
{if(pre[x]==x) return x;return pre[x]=find(pre[x]);
}
bool cmp(node a,node b)
{return a.w<b.w;//边排序 
}
void build(int x,int y,int z)
{e[++b].u=x;e[b].v=y;e[b].w=z;//用与建边 
}
void Kruskal()
{sort(e+1,e+1+b,cmp);for(int i=1;i<=b;i++){if(find(e[i].u)!=find(e[i].v)){pre[find(e[i].u)]=find(e[i].v);ans+=e[i].w;}}
}
int main()
{cin>>A>>m;for(int i=1;i<=m;i++) build(0,i,A);for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){int x;cin>>x;if(x&&i<j)//i<j为了防止重复建边,其实不加也可以,但是这样加快运行速度 build(i,j,x);}}for(int i=1;i<=m;i++) pre[i]=i;//初始化 Kruskal();cout<<ans<<endl;//直接输出答案 return 0;
}

2.Building Roads S

P2872 [USACO07DEC] Building Roads S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

给定 n 个点的坐标,第 i 个点的坐标为 (xi​,yi​),这 n 个点编号为 1 到 n。给定 m 条边,第 i 条边连接第 ui​ 个点和第 vi​ 个点。现在要求你添加一些边,并且能使得任意一点都可以连通其他所有点。求添加的边的总长度的最小值。

输出格式

第一行两个整数 n,m 代表点数与边数。
接下来 n 行每行两个整数 xi​,yi​ 代表第 i 个点的坐标。
接下来 m 行每行两个整数 ui​,vi​ 代表第 i 条边连接第 ui​ 个点和第 vi​ 个点。

输出格式

一行一个实数代表添加的边的最小长度,要求保留两位小数,为了避免误差, 请用 64 位实型变量进行计算。

输入输出样例

输入 #1

4 1
1 1
3 1
2 3
4 3
1 4

输出 #1

4.00

数据范围

1≤n,m≤1000,1≤xi​,yi​≤10^6,1≤ui​,vi​≤n。

这道题比第一题容易看懂多了,我们只需要对每个坐标之间建边,在后续的Kruskal算法中一直添边,直到全部联通。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int u,v;double w;
}e[1000100];
int n,m,k,pre[1010],X[1010],Y[1010];
double ans;
int find(int x)
{if(pre[x]==x) return x;return pre[x]=find(pre[x]);
}
bool cmp(node a,node b)
{return a.w<b.w;//边排序 
}
double dist(int x1,int y1,int x2,int y2)
{//double需要这样加,不然出错 return (double)sqrt((double)(x1-x2)*(double)(x1-x2)+(double)(y1-y2)*(double)(y1-y2));
}
void Kruskal()
{sort(e+1,e+k+1,cmp);for(int i=1;i<=k;i++){if(find(e[i].u)!=find(e[i].v)){ans+=e[i].w;pre[find(e[i].u)]=find(e[i].v);}}
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)pre[i]=i;for(int i=1;i<=n;i++){cin>>X[i]>>Y[i];}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){e[++k].u=i;e[k].v=j;e[k].w=dist(X[i],Y[i],X[j],Y[j]);//建边 }}int temp=m;while(temp--){int a,b;cin>>a>>b;if(find(a)!=find(b)) pre[find(a)]=find(b);//直接合并 }Kruskal();printf("%.2lf\n",ans);//保留两位小数输出 return 0;
}

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

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

相关文章

HTTP 响应状态代码

HTTP 响应状态代码 HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。 响应分为五类&#xff1a; 信息性回复 &#xff08; 100 – 199​)成功响应 &#xff08; 200 – 299​)重定向消息 &#xff08; 300 – 399​)客户端错误响应 &#xff08; 400 – 499​)服务器错误…

《VulnHub》GoldenEye:1

title: 《VulnHub》GoldenEye&#xff1a;1 date: 2024-02-16 14:53:49 updated: 2024-02-16 15:08:49 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、目标信息扫描、源码 js 文件泄露敏感信息、hydra 爆破邮件服务&#xff08;pop3&#xff09;、邮件泄露敏…

撑住!再好的命,也有坎坷的时候

再好的命&#xff0c;其实都有为难的时候&#xff0c;都有经历磨难的时候。要想真正强大起来&#xff0c;都要度过一段没人帮忙&#xff0c;所有事情都是自己一个人撑&#xff0c;所有情绪和思想&#xff0c;都只有自己知道的日子。但只要咬牙撑过去&#xff0c;一切就都不一样…

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

首先说明一点&#xff0c;finally{ }里面的code一定会执行 &#xff0c;至于是在return前执行还是在return后执行&#xff08;个人认为是{}代码执行完之后并且在return执行之前&#xff09;&#xff0c;具体需要分情况&#xff1a; 1.若try{}中没有异常&#xff0c;则try{}中语…

中科星图GVE——矢量之间的交集,并集和差集等关系

简介 矢量是数学中的一个重要概念,它可以分为有序矢量和无序矢量。在数学中,我们经常需要对矢量之间的关系进行分析,包括求交集、并集和差集等运算。下面将对这些概念进行具体解释。 1. 交集: 矢量的交集是指两个矢量中共同存在的元素所构成的集合。假设有两个矢量A和B,…

【JAVA-Day86】守护线程

守护线程 守护线程摘要引言1. 了解守护线程&#xff1a;它是什么&#xff1f;&#x1f47b;特点和用途示例代码 2. 为何我们需要守护线程&#xff1f;&#x1f47b;辅助性任务处理不阻止程序的正常运行重要的清理工作示例代码&#x1f4da; 3. 如何创建和管理守护线程&#xff…

使用Taro开发鸿蒙原生应用——快速上手,鸿蒙应用开发指南

导读 本指南为开发者提供了使用 Taro 框架开发鸿蒙原生应用的快速入门方法。Taro&#xff0c;作为一个多端统一开发框架&#xff0c;让开发者能够使用一套代码同时适配多个平台&#xff0c;包括鸿蒙系统。文章将详细介绍如何配置开发环境&#xff0c;以及如何利用 Taro 的特性…

真假难辨 - Sora(OpenAI)/世界模拟器的技术报告

目录 引言技术报告汉译版英文原版 引言 Sora是OpenAI在2024年2月15日发布的世界模拟器&#xff0c;功能是通过文本可以生成一分钟的高保真视频。由于较高的视频质量&#xff0c;引起了巨大关注。下面是三个示例&#xff0c;在示例之后给出了其技术报告&#xff1a; tokyo-wal…

树形dp 笔记

树的最长路径 给定一棵树&#xff0c;树中包含 n 个结点&#xff08;编号1~n&#xff09;和 n−1 条无向边&#xff0c;每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说&#xff0c;要找到一条路径&#xff0c;使得使得路径两端的点的距离最远。 注意&…

Java泛型编译期擦除,为什么反射还能拿到泛型信息?

首先放上运行期反射获取Java泛型类型的相关信息的代码&#xff1a; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;public class Test2 {public static void main(String[] args) {Example<String> example new Example<String>() …

Base64编码的优点与缺点

title: Base64编码的优点与缺点 date: 2024/2/16 14:06:37 updated: 2024/2/16 14:06:37 tags: Base64编码ASCII转换数据传输文本存储安全性数据膨胀字符串解码 Base64编码是一种将二进制数据转换为可打印ASCII字符的编码方式。它被广泛应用于数据传输和存储&#xff0c;以提升…

Pytest测试技巧之Fixture:模块化管理测试数据

在 Pytest 测试中&#xff0c;有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture&#xff0c;特别是如何利用 Fixture 实现测试数据的模块化管理&#xff0c;以提高测试用例的清晰度和可复用性。 什么是Fixture&#xff1f; 在 Pytest 中&a…

迎新年,送新手福利, 送2篇nhanes文章全套复现代码

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 本次赠送…

uniapp实现手机横屏(方法二)

在manifest.json文件中&#xff0c;将"deviceOrientation"属性设置为"auto"&#xff0c;这样整个应用程序将支持横屏显示。 在需要横屏显示的页面的<script>标签中&#xff0c;添加onShow生命周期函数&#xff0c;并在函数中调用uni.setScreenOrien…

2024年【T电梯修理】报名考试及T电梯修理考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【T电梯修理】报名考试及T电梯修理考试报名&#xff0c;包含T电梯修理报名考试答案和解析及T电梯修理考试报名练习。安全生产模拟考试一点通结合国家T电梯修理考试最新大纲及T电梯修理考试真题汇总&#xff0c;…

【Redis快速入门】Redis三种集群搭建配置(主从集群、哨兵集群、分片集群)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

[嵌入式系统-14]:常见实时嵌入式操作系统比较:RT-Thread、uC/OS-II和FreeRTOS、Linux

目录 一、实时嵌入式操作系统 1.1 概述 1.2 什么“实时” 1.3 什么是硬实时和软实时 1.4 什么是嵌入式 1.5 什么操作系统 二、常见重量级操作系统 三、常见轻量级嵌入式操作系统 3.1 概述 3.2 FreeRTOS 3.3 uC/OS-II 3.4 RT-Thread 3.5 RT-Thread、uC/OS-II、Free…

【数据结构】并查集

并查集是简单的数据结构&#xff0c;学会并查集&#xff0c;为图打好基础。 并查集的概念 是树状的数据结构&#xff0c;用于处理相交集合的合并与查询 通常用森林表示&#xff0c;一片森林表示一个集合 并查集一般需要完成 查找元素属于哪个集合查看两个元素是否属于同一个集…

JDBC 核心 API

引入 mysql-jdbc 驱动 驱动 jar 版本的选择&#xff1a;推荐使用 8.0.25&#xff0c;省略时区设置java 工程导入依赖 项目创建 lib 文件夹导入驱动依赖 jar 包jar 包右键 - 添加为库 JDBC 基本使用步骤 注册驱动获取连接创建发送 sql 语句对象发送 sql 语句&#xff0c;并获…

GPT SOVITS项目 一分钟克隆 (文字输出)

步骤流程&#xff1a;&#xff08;首先使用UVR 提取人声文件&#xff0c;然后按下面步骤进行&#xff09; 注意这里提交的音频是参考的音频