NOIP 2017 宝藏----Java题解

目录

NOIP 2017 宝藏

题目描述

输入描述:

输出描述:

输入

输出

说明

输入

输出

说明

备注:

代码实现:


 

NOIP 2017 宝藏

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。
小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远,也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路则相对容易很多。
小明的决心感动了考古挖掘的赞助商, 赞助商决定免费赞助他打通一条从地面到某个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。
在此基础上, 小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏屋之间的道路无需再开发。
新开发一条道路的代价是:
这条道路的长度 x 从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋)。
请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代价最小,并输出这个最小值。

输入描述:

第一行两个用空格分离的正整数 n 和 m,代表宝藏屋的个数和道路数。
接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏屋的编号(编号为 1~n),和这条道路的长度 v。

输出描述:

输出共一行,一个正整数,表示最小的总代价。

示例1

输入

复制4 5 1 2 1 1 3 3 1 4 1 2 3 4 3 4 1

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

输出

复制4

4

说明

 

示例2

输入

复制4 5 1 2 1 1 3 3 1 4 1 2 3 4 3 4 2

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

输出

复制5

5

说明

 

备注:

对于 20% 的数据:保证输入是一棵树, 1≤ n≤8, v≤ 5000 且所有的 v 都相等。
对于 40% 的数据:1≤ n≤ 8, 0≤ m≤ 1000, v≤ 5000 且所有的 v 都相等。
对于 70% 的数据:1≤ n≤ 8, 0≤ m≤ 1000, v≤  5000。
对于 100% 的数据:1≤ n≤ 12, 0≤ m≤ 1000, v≤  500000。

思路解析:

看到数据点n<=12,并且已经选择过的两个任意相邻宝藏点之间的房屋不可再开辟新的道路,可以看出是状压dp。

然后这题比较妙的是因为我们并不知道当前这个点的开发线路是当前线路的第几个点(可能有多种情况可以选择的开发方案)我们并不知道这些方案中那些方案对于以后的抉择是最优秀的,我们只能确定的是他在当前的抉择可能是最优秀的。所以我们枚举这些点的所有开发可能性,有些可能性可能不存在则countinue掉,但是这样枚举可能会使某些状态进行大量无效解的计算,但是一定会包含最优解。又因为枚举可能性是线性的只是会让整体时间复杂度有一个常数级的倍增是可以接受的。

代码实现:

import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;/*** @ProjectName: study3* @FileName: Ex36* @author:HWJ* @Data: 2023/11/14 12:01*/
public class Main {static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static Input input = new Input(System.in);static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) {int n = input.nextInt();int m = input.nextInt();int[][] map = new int[n][n];int inf = 1000000000;for (int i = 0; i < n; i++) {Arrays.fill(map[i], inf);map[i][i] = 0;}for (int i = 0; i < m; i++) {int x = input.nextInt() - 1;int y = input.nextInt() - 1;int val = input.nextInt();map[x][y] = Math.min(map[x][y], val);map[y][x] = Math.min(map[y][x], val);}long ans = Long.MAX_VALUE;long[][] dp = new long[n][1 << n]; // dp[i][st]表示当前状态st在第i层的最小花费数。for (int i = 0; i < n; i++) {Arrays.fill(dp[i], inf);}for (int i = 0; i < n; i++) {dp[0][1 << i] = 0;}for (int i = 1; i < 1 << n; i++) {for (int j = (i - 1) & i; j > 0; j = (j - 1) & i) {int point = j ^ i;long sum = 0;for (int x = 0; x < n; x++) {int min = inf;if (((1 << x) & point) == 0) continue;for (int y = 0; y < n; y++) {if (((1 << y) & j) == 0) continue;min = Math.min(min, map[x][y]);}sum+=min;}if (sum >= inf) continue;for (int k = 1; k < n; k++) {dp[k][i] = Math.min(dp[k][i], dp[k - 1][j] + k * sum);}}}for (int i = 0; i < n; i++) {ans = Math.min(ans, dp[i][(1 << n) - 1]);}System.out.println(ans);}static class Input {public BufferedReader reader;public StringTokenizer tokenizer;public Input(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = null;}public String next() {while (tokenizer == null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(reader.readLine());} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}public String nextLine() {String str = null;try {str = reader.readLine();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return str;}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public Double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}
}

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

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

相关文章

Meta开源支持1000多种语言的文本转语音与语音识别大语言模型

据不完全统计,地球上有超过7000多种语言,而现在的大语言模型仅仅只涉及到了主流的100多种语言。相对全球7000多种语言来讲,这仅仅只是其中的一小部分。如何让全球的人获益,把大语言模型扩展到更多的语言上,一直是大语言模型研究的重点。Meta发布了涵盖 1406 种语言的预训练…

修改Openwrt软路由的web端口

如何修改openwrt路由器的web访问端口号&#xff1f; 在OpenWrt路由器上&#xff0c;如何修改Web访问端口号&#xff0c;通常涉及到修改HTTP服务器的配置文件。默认情况下&#xff0c;OpenWrt使用的HTTP服务器是uHTTPd。 以下是修改Web访问端口号的步骤&#xff1a; 一、通过…

Install Docker in Linux

Docker官网链接: https://docs.docker.com/ 1.确定Linux版本 新版本的Docker对Linux系统版本有一定的要求。如果Linux的发行版系统是centOS&#xff0c;安装最新版的docker需要centOS 7以上的系统。 在Docker安装帮助页面查看支持的系统版本。 Docker帮助页面:https://docs…

dameng数据库数据id decimal类型,精度丢失

问题处理 这一次也是精度丢失&#xff0c;但是问题呢还是不一样&#xff0c;这一次所有的id都被加一了&#xff0c;只有id字段被加一&#xff0c;还有的查询查出来封装成对象之后对象的id字段被减一了&#xff0c;数据库id字段使用的decimal&#xff08;20,6&#xff09;&…

接口测试和功能测试有什么区别

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

阿里云 OSS使用介绍

1、什么是阿里云 OSS&#xff1f; OSS 为 Object Storage Service&#xff0c;即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 OSS 具有与平台无关的 RESTful API 接口&#xff0c;可以在任意应用、任意时间、任意地点 存储与访问 任何类型的数据。…

【vue】0到1的常规vue3项目起步

创建项目并整理目录 npm init vuelatestjsconfig.json配置别名路径 配置别名路径可以在写代码时联想提示路径 {"compilerOptions" : {"baseUrl" : "./","paths" : {"/*":["src/*"]}} }elementPlus引入 1. 安装e…

玩转硬件之C51的玩法(一)——破解“口红糖”中的电路

智能玩具&#xff1a;玩具行业的新风口 玩具是儿童的好伙伴&#xff0c;也是成人的乐趣来源。 随着科技的进步和消费的升级&#xff0c;玩具的形式和功能也在不断创新&#xff0c;智能玩具作为玩具行业的新风口&#xff0c;正受到越来越多的关注和喜爱。 什么是智能玩具&…

关于session的不断变化问题

今天在帮同学解决一个小问题&#xff0c;差点阴沟翻船。 问题再现&#xff1a;他从github上拉了一个项目下来跑&#xff0c;结果发生跑不通问题出现在验证码一直不对。 我一看项目源码&#xff0c;验证码生成后存储再session中了&#xff0c;等用户发送请求验证的时候sessionI…

若依侧边栏添加计数标记效果

2023.11.13今天我学习了如何对若依的侧边栏添加技术标记的效果&#xff0c;如图&#xff1a; 我们需要用到两个页面&#xff1a; 先说子组件实现计数标记效果 1.item.vue <script> export default {name: MenuItem,functional: true,props: {icon: {type: String,defau…

代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组

前言 本期我们来解决动规的经典题型------ 子数组问题 我们还是会使用动规五部曲来解决问题,下面我们仍然列出动规五部曲 1.明确dp数组含义 2.明确dp数组如何推导-递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组排错 LeetCode T300 最长递增子序列 题目链接:300. 最长…

MYSQL字符串函数详解和实战(字符串函数大全,内含示例)

MySQL提供了许多字符串函数&#xff0c;用于处理和操作字符串数据。以下是一些常用的MYSQL字符串函数。 建议收藏以备后续用到查阅参考。 目录 一、CONCAT 拼接字符串 二、CONCAT_WS 拼接字符串 三、SUBSTR 取子字符串 四、SUBSTRING 取子字符串 五、SUBSTRING_INDEX 取子…