牛客题解 | 游游的旅行

news/2025/3/10 10:31:24/文章来源:https://www.cnblogs.com/wc529065/p/18762042

题目

题目链接

解题思路

这是一道动态规划和期望计算的问题,主要思路如下:

  1. 问题分析:

    • \(n\) 个景点构成无向图
    • 每个景点参观需要 \(m_i\) 时间,增加愉悦度 \(v1_i\)\(v2_i\)
    • 景点间通过 \(m\) 条路径连接,每条路径耗时 \(t_i\)
    • 总游玩时间为 \(k\) 分钟
    • 需要计算游游和小伙伴的期望愉悦度
  2. 解决方案:

    • 使用动态规划计算期望值
    • \(dp[i][j]\) 表示剩余 \(i\) 时间在 \(j\) 点的期望愉悦度
    • 考虑每个景点的游玩时间和路径选择
    • 分别计算两个人的期望值
  3. 实现细节:

    • 使用邻接表存储图结构
    • 处理随机选择的概率计算
    • 注意浮点数精度

代码

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;struct Site {int m;          // 游玩时间double v[2];    // 两人的愉悦度
};struct Path {int d;          // 目标景点int t;          // 路径时间
};// 计算期望愉悦度
double getExpectation(vector<Site>& sites, vector<vector<Path>>& paths, int k, int p) {int n = sites.size();// dp[i][j]表示剩余i时间在j点的期望愉悦度vector<vector<double>> dp(k + 1, vector<double>(n, 0));for (int i = 1; i <= k; i++) {for (int j = 0; j < n; j++) {double temp = 0;int count = 0;// 如果时间足够游玩当前景点if (i >= sites[j].m) {dp[i][j] += sites[j].v[p];}// 考虑所有可达的下一个景点for (const Path& path : paths[j]) {if (i >= (path.t + sites[j].m + sites[path.d].m)) {temp += dp[i - path.t - sites[j].m][path.d];count++;}}// 计算期望值if (count) {dp[i][j] += temp / count;}}}// 计算最终期望double res = 0;for (int i = 0; i < n; i++) {res += dp[k][i];}return res / n;
}int main() {int n, m, k;while (cin >> n >> m >> k) {// 读入景点信息vector<Site> sites(n);for (int i = 0; i < n; i++) {cin >> sites[i].m >> sites[i].v[0] >> sites[i].v[1];}// 读入路径信息vector<vector<Path>> paths(n);for (int i = 0; i < m; i++) {int x, y, t;cin >> x >> y >> t;x--; y--;paths[x].push_back({y, t});paths[y].push_back({x, t});}// 计算两人的期望愉悦度double res1 = getExpectation(sites, paths, k, 0);double res2 = getExpectation(sites, paths, k, 1);cout << fixed << setprecision(5) << res1 << " " << res2 << endl;}return 0;
}
import java.util.*;public class Main {static class Site {int m;double[] v = new double[2];}static class Path {int d, t;Path(int d, int t) {this.d = d;this.t = t;}}static double getExpectation(Site[] sites, List<Path>[] paths, int k, int p) {int n = sites.length;double[][] dp = new double[k + 1][n];for (int i = 1; i <= k; i++) {for (int j = 0; j < n; j++) {double temp = 0;int count = 0;if (i >= sites[j].m) {dp[i][j] += sites[j].v[p];}for (Path path : paths[j]) {if (i >= (path.t + sites[j].m + sites[path.d].m)) {temp += dp[i - path.t - sites[j].m][path.d];count++;}}if (count > 0) {dp[i][j] += temp / count;}}}double res = 0;for (int i = 0; i < n; i++) {res += dp[k][i];}return res / n;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();int m = sc.nextInt();int k = sc.nextInt();Site[] sites = new Site[n];for (int i = 0; i < n; i++) {sites[i] = new Site();sites[i].m = sc.nextInt();sites[i].v[0] = sc.nextDouble();sites[i].v[1] = sc.nextDouble();}@SuppressWarnings("unchecked")List<Path>[] paths = new List[n];for (int i = 0; i < n; i++) {paths[i] = new ArrayList<>();}for (int i = 0; i < m; i++) {int x = sc.nextInt() - 1;int y = sc.nextInt() - 1;int t = sc.nextInt();paths[x].add(new Path(y, t));paths[y].add(new Path(x, t));}double res1 = getExpectation(sites, paths, k, 0);double res2 = getExpectation(sites, paths, k, 1);System.out.printf("%.5f %.5f%n", res1, res2);}sc.close();}
}
class Site:def __init__(self):self.m = 0self.v = [0, 0]class Path:def __init__(self, d, t):self.d = dself.t = tdef get_expectation(sites, paths, k, p):n = len(sites)dp = [[0] * n for _ in range(k + 1)]for i in range(1, k + 1):for j in range(n):temp = 0count = 0if i >= sites[j].m:dp[i][j] += sites[j].v[p]for path in paths[j]:if i >= (path.t + sites[j].m + sites[path.d].m):temp += dp[i - path.t - sites[j].m][path.d]count += 1if count:dp[i][j] += temp / countreturn sum(dp[k]) / ndef main():while True:try:n, m, k = map(int, input().split())sites = [Site() for _ in range(n)]for i in range(n):m_i, v1, v2 = map(float, input().split())sites[i].m = int(m_i)sites[i].v = [v1, v2]paths = [[] for _ in range(n)]for _ in range(m):x, y, t = map(int, input().split())x -= 1y -= 1paths[x].append(Path(y, t))paths[y].append(Path(x, t))res1 = get_expectation(sites, paths, k, 0)res2 = get_expectation(sites, paths, k, 1)print(f"{res1:.5f} {res2:.5f}")except EOFError:breakif __name__ == "__main__":main()

算法及复杂度

  • 算法:动态规划
  • 时间复杂度:\(\mathcal{O}(k * n * m)\) - \(k\) 为总时间,\(n\) 为景点数,\(m\) 为平均路径数
  • 空间复杂度:\(\mathcal{O}(k * n)\) - 动态规划数组大小

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

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

相关文章

GreatSQL 8.0.32-27 GA (2025-3-10)

GreatSQL 8.0.32-27 GA (2025-3-10)版本信息发布时间:2025年3月10日版本号:8.0.32-27, Revision aa66a385910下载链接:https://gitee.com/GreatSQL/GreatSQL/releases/tag/GreatSQL-8.0.32-27用户手册:https://greatsql.cn/docs/8.0.32-27/改进提升 在GreatSQL 8.0.32-27版…

牛客题解 | 求整数的阶乘

牛客题库题解题目 题目链接 题解: 题目难度:中等难度 难点: 1.由于数据太大无法通过整数类型表示,因此用字符串存储结果 2.对于每个字符串从尾部开始进行简单的乘法,在其中考虑进位 知识点:大数相乘 思路: 1.构造multiply(int x, int res[], int res_size)函数,数组res…

OP13常见问题

1.直振与切料口的对中 问题:对中不良,导致送料不到位,对光传感器检测不到产品,报警直振缺料。解决方法: 先检查气缸自带的行程调节器有无松动,如果没有松动,通过微调振动盘机构的位置及底脚高度,实现切料口上下左右的对中。2.机器人夹爪气缸磁开线路 1.M8接头长期晃动,…

Android Studio 2022下载与安装

1、安装包 扫描下方二维码关注「软知社」,后台回复【066】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程解压下载安装包,双击Setup.exe安装,弹窗安装对话框点击下一步默认,点击下一步选择安装目录,建议选择C盘之外,点击下一步点击安装安装完成,点击下一…

Adobe Photoshop 2025下载与安装

‌Photoshop 2025的安装环境要求主要包括操作系统、处理器、内存、显卡、显示器分辨率和硬盘空间等方面的具体要求。‌ 操作系统要求‌Windows‌:支持Windows 10(版本21H2)或更高版本,不支持Windows的长期服务版(LTSC)。处理器要求‌Windows‌:支持64位的多核Intel或AMD…

Capture one 2023下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【061】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件和系统防护)解压下载安装包,双击软件安装,弹窗安装对话框选择中文,点击确定选择‘我同意。’ 点击下一步选择安装目录,建议C盘之外…

S3FT选择性自监督微调:通过智能选择训练样本提升大模型整体表现

选择性自我监督微调(Selective Self-to-Supervised Fine-Tuning,S3FT)是一种创新的大语言模型微调方法,该方法通过部署专门的语义等价性判断器来识别训练集中模型自身生成的正确响应。在微调过程中,S3FT策略性地结合这些正确响应与剩余样本的标准答案(或其释义版本)来优…

20242935 2024-2025-2 《网络攻防实践》第二周作业

20242935 2024-2025-2 《网络攻防实践》第二周作业 网络信息收集技术 一、实验要求 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理…

Xmanager 8下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【059】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件与本地防护设置)双击Xmanager-8.0.0055r.exe安装,弹窗安装对话框点击下一步选择‘我接受。。’,点击下一步选择安装目录D盘,点击下一…

Xftp 8软件下载与安装教程

Xftp 8中文版是一款十分强大、传输快速的FTP文件传输工具,它拥有着十分庞大的用户群体,其凭借着简单的界面、便捷的操作以及强大的功能,深受广大用户的好评与喜爱,当然它也是许许多多专业人士的必备工具之一。 由于Xftp 8是基于MS windows平台的STP和FTP传输工具,所以它不…

HarmonyOS SDK让小红书鸿蒙用户尽享原生相机的拍摄之美

小红书是深受年轻人喜爱的生活社交类社区平台,越来越多的人在小红书上分享旅行、日常、心情。近日,不少使用鸿蒙原生版小红书的细心用户已经发现,直接使用小红书拍摄照片与自己使用原相机拍摄有一样清晰美观的呈现效果。不仅如此,小红书现已支持用户直接从图库中上传动态照…

Xshell 8软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【057】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件与本地防护设置)双击Xshell-8.0.0055r.exe安装,弹窗安装对话框点击下一步选择‘我接受。。’,点击下一步选择安装目录D盘,点击下一步…