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());
        }
    }
}

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

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

相关文章

viple模拟器使用(一):线控模拟

(1)unity模拟器 通过viple程序&#xff0c;将viple编写逻辑运行在unity模拟器中。 首先编写viple程序&#xff0c;逻辑&#xff1a;设置一个机器人主机&#xff0c;并且&#xff0c;按↑、↓、←、→方向键的时候&#xff0c;能分别控制模拟机器人在unity模拟器中运行。 主机…

【Linux基础IO篇】深入理解文件系统、动静态库

【Linux基础IO篇】深入理解文件系统、动静态库 目录 【Linux基础IO篇】深入理解文件系统、动静态库再次理解文件系统操作系统内存管理模块&#xff08;基础&#xff09;操作系统如何管理内存 Linux中task_struct源码结构 动态库和静态库动静态库介绍&#xff1a;生成静态库库搜…

学Diffusion前需要储备的一些知识点

自学Diffusion是非常困难的&#xff0c;尤其是到了VAE和VI这里基本找不到比较好的中文资料&#xff0c;甚至是涉及到一些重参数化&#xff0c;高斯混合之类的问题摸不着来龙去脉。在本文中&#xff0c;基本不会涉及公式&#xff0c;只有intuition和理解&#xff0c;如果要看公式…

NC 56 单据接口报错排查一例

前言 自从公司的古董 NC ERP 接入了共享财务系统、我们就开始了漫长的排障生涯。下面分享一例接口数据报错的分析和处理方案。 操作环境 NC 客户端是 windows 的 V56 版本。生产环境数据库是 oracle 、数据库访问用了 PL/SQL。 验证过程 早上接到了共享财务系统的报错&…

从流程优化到经营提效,法大大电子签全面助力智慧零售升级

在新零售模式下&#xff0c;“商业综合体、百货商场、连锁商超、连锁便利店、线上电商平台”等各类商业零售企业借助数字化的手段来改造和重塑传统零售流程和逻辑&#xff0c;实现全面数字化转型&#xff0c;包括线上线下一体化、全场景覆盖、全链条联通、全渠道经营、客户服务…

保序回归:拯救你的校准曲线(APP)

保序回归&#xff1a;拯救你的校准曲线&#xff08;APP&#xff09; 校准曲线之所以是评价模型效能的重要指标是因为&#xff0c;校准曲线衡量模型预测概率与实际发生概率之间的一致性&#xff0c;它可以帮助我们了解模型的预测结果是否可信。一个理想的模型应该能够准确地预测…

快乐数问题

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1&#xff…

如何在Photoshop 中创建橡皮图章效果

如何在 Photoshop 中制作橡皮图章。只需几个快速步骤即可将任何照片变成橡皮图章图像 1. 如何创建垃圾纸背景 步骤1 让我们开始学习如何制作自定义印章。创建一个新的850 x 550 像素 文档。当然&#xff0c;您可以为 PSD 文件使用其他尺寸&#xff0c; 但必须按比例调整本教程…

关于Flume-Kafka-Flume的模式进行数据采集操作

测试是否连接成功&#xff1a; 在主节点flume目录下输入命令: bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf -Dflume.root.loggerinfo,console # 这个file_to_kafka.conf文件就是我们的配置文件 然后在另一台节点输入命令进行消费数据&#xff1a; kafka-cons…

人工智能学院承办南山区区块链公益职业技能培训

11月4日&#xff0c;南山区人力资源局主办、深圳职业技术大学承办的2023年南山区公益职业技能培训项目——区块链技术应用项目&#xff0c;于当天在深圳职业技术大学西丽湖校区图书馆西厅正式开班。此次培训将持续至11月18日。南山区人力资源局职业能力建设科科长张仁勇、人工智…

AVL树的插入和删除

一.AVL树的四种旋转方式 以上是AVL树插入和删除时需要用到的四种旋转方式。为什么要旋转&#xff1f;因为树不平衡了,通过旋转使其再次平衡。 但是上面的四副图在旋转前就是平衡的&#xff0c;所以这样的旋转是没有意义的&#xff0c;重点在于理解旋转的方法。下面的插入和删除…

Nexus的Maven私有仓库搭建

Nexus的maven私有仓库搭建 一、了解 maven仓库设置 默认设置 其中&#xff1a; maven-central: 预定义的代理Maven Central仓库&#xff0c;它包含了大量的开源Java依赖包。maven-public: 存储库是一个组合存储库&#xff0c;它包含了maven-releases和maven-snapshots存储库…

【MySQL系列】 第三章 · 函数

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

支付宝支付==沙盒

地址 登录 - 支付宝 可以看到有买家和卖家账户了 完整代码 https://gitee.com/hebian1994/demo-zhifubao.git

动作活体检测能力支持自定义扫描动作,开发者接入更高效

随着人脸识别技术在金融、医疗等多个领域的加速落地&#xff0c;网络安全、信息泄露等问题愈为突出&#xff0c;用户对应用稳定性和安全性的要求也更为严格。 华为机器学习服务的动作活体检测能力&#xff0c;支持实时捕捉人脸&#xff0c;根据用户配合做动作可以判断是真实活…

Centos7.9用rancher来快速部署K8S

什么是 Rancher&#xff1f; Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群&#xff0c;创建节点并安装 Kubernetes&#xff0c;或者导入在任何地方运行的现有 Kube…

H5游戏源码分享-网页版2048小游戏

H5游戏源码分享-网页版2048小游戏 玩过的都懂 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>分享2048到朋友圈&#xff0c;将免费参加南山郡8.17号啤酒狂欢节&#xff01;</title><link href"style/main…

Windows配置IP-SAN(iSCSI)

之前写了《Linux配置IP-SAN&#xff08;iSCSI&#xff09;》&#xff0c;现在简单记录Windows配置IP-SAN&#xff08;iSCSI&#xff09;&#xff0c;基本过程都是一样的。一些原理请参考《Linux配置IP-SAN&#xff08;iSCSI&#xff09;》&#xff0c;更详细一些。 目录 一、确…

Spring核心

Spring Framework Spring的两个核心IOC控制反转IOC容器依赖注入DIIOC容器实现注解管理BeanBean对象定义Bean对象获取 AOP面向切面编程 添加依赖入门案例注解通过Spring创建Java bean对象 xml管理Bean案例main下创建bean.XMl文件 DI依赖注入案例创建Spring配置文件 bean-di.xml …

低成本毫米波雷达系统设计与研发

毫米波雷达系统在汽车、工业感知和安全领域等多个领域有着广泛的应用。然而&#xff0c;传统毫米波雷达系统的高昂成本限制了其普及。本文介绍了一种低成本毫米波雷达系统的设计与研发&#xff0c;旨在降低成本的同时保持系统性能。 毫米波雷达工作在30到300 GHz的频率范围内&a…