当前位置: 首页 > news >正文

UVa 436 Arbitrage (II)

题目描述

题目要求判断是否存在套利机会。给定若干种货币和它们之间的兑换汇率,判断是否存在一种兑换序列,使得从某种货币出发,经过一系列兑换后,最终得到多于原来数量的同一货币。

输入格式

输入包含多个测试用例。每个测试用例格式如下:

  • 第一行一个整数nnn1≤n≤301 \le n \le 301n30),表示货币种类数。
  • 接下来nnn行,每行一种货币的名称(不含空格)。
  • 下一行一个整数mmm,表示汇率表的条目数。
  • 接下来mmm行,每行包含:源货币名称、汇率(实数)、目标货币名称。
  • 测试用例之间由一个空行分隔。
  • 输入以n=0n = 0n=0结束。

输出格式

对于每个测试用例,输出一行:

Case case: Yes

Case case: No

其中case为测试用例编号(从111开始)。

样例

输入

3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc 0

输出

Case 1: Yes Case 2: No

题目分析

本题的核心是判断货币兑换图中是否存在乘积大于111的环。由于汇率是乘积关系,而不是加法,需要将乘法转化为加法(取对数),然后使用Floyd-Warshall\texttt{Floyd-Warshall}Floyd-WarshallBellman-Ford\texttt{Bellman-Ford}Bellman-Ford算法检测正环。

问题转化

设汇率矩阵R[i][j]R[i][j]R[i][j]表示从货币iii到货币jjj的直接兑换汇率。若存在路径i→k1→k2→⋯→ji \to k_1 \to k_2 \to \dots \to jik1k2j,则兑换汇率为R[i][k1]×R[k1][k2]×⋯×R[km][j]R[i][k_1] \times R[k_1][k_2] \times \dots \times R[k_m][j]R[i][k1]×R[k1][k2]××R[km][j]。套利机会等价于存在一个环i→ii \to iii,使得路径乘积>1> 1>1

对数转化

取自然对数:ln⁡(R[i][j])\ln(R[i][j])ln(R[i][j])。则路径乘积>1> 1>1等价于∑ln⁡(R)>0\sum \ln(R) > 0ln(R)>0。问题转化为检测是否存在正权环。

算法选择

由于n≤30n \le 30n30,可以使用Floyd-Warshall\texttt{Floyd-Warshall}Floyd-Warshall算法的变体,直接维护最大路径乘积:
dist[i][j]=max⁡k(dist[i][k]×dist[k][j]) dist[i][j] = \max_{k} (dist[i][k] \times dist[k][j])dist[i][j]=kmax(dist[i][k]×dist[k][j])
初始时,dist[i][i]=1dist[i][i] = 1dist[i][i]=1,有直接汇率的dist[i][j]=dist[i][j] =dist[i][j]=汇率,否则为000(表示不可达)。经过nnn次松弛后,若存在dist[i][i]>1dist[i][i] > 1dist[i][i]>1,则存在套利机会。

实现细节

  • 使用map<string, int>将货币名称映射为整数索引。
  • 初始化距离矩阵为000(不可达),对角线为111
  • 读入汇率时,将对应位置设为汇率。
  • 执行三重循环更新:若dist[i][k]>0dist[i][k] > 0dist[i][k]>0dist[k][j]>0dist[k][j] > 0dist[k][j]>0,则dist[i][j]=max⁡(dist[i][j],dist[i][k]×dist[k][j])dist[i][j] = \max(dist[i][j], dist[i][k] \times dist[k][j])dist[i][j]=max(dist[i][j],dist[i][k]×dist[k][j])
  • 最后检查所有dist[i][i]>1dist[i][i] > 1dist[i][i]>1即可。

复杂度分析

Floyd-Warshall\texttt{Floyd-Warshall}Floyd-Warshall时间复杂度O(n3)O(n^3)O(n3)n≤30n \le 30n30,完全可接受。

代码实现

// Arbitrage (II)// UVa ID: 436// Verdict: Accepted// Submission Date: 2016-07-21// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constdoubleEPSILON=1e-7;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);doublematrix[40][40];intn,m,cases=0;while(cin>>n,n){for(inti=0;i<40;i++)for(intj=0;j<40;j++)matrix[i][j]=-1.0;map<string,int>currency;string currency_name;for(inti=1;i<=n;i++){cin>>currency_name;currency[currency_name]=i;}cin>>m;string start_currency,end_currency;doublerate;for(inti=1;i<=m;i++){cin>>start_currency>>rate>>end_currency;matrix[currency[start_currency]][currency[end_currency]]=rate;}for(intk=1;k<=n;k++)for(inti=1;i<=n;i++)for(intj=1;j<=n;j++){if(matrix[i][k]>0.0&&matrix[k][j]>0.0){if(matrix[i][k]*matrix[k][j]>matrix[i][j]+EPSILON)matrix[i][j]=matrix[i][k]*matrix[k][j];}}boolarbitrage=false;for(inti=1;i<=n;i++)if(matrix[i][i]>1.0+EPSILON){arbitrage=true;gotoskip;}skip:cout<<"Case "<<++cases<<": "<<(arbitrage?"Yes":"No")<<'\n';}return0;}
http://www.zskr.cn/news/1494715.html

相关文章:

  • 微信小程序反编译技术深度解析:wxapkg-convertor实战指南
  • 嵌入式设计核心:从K12外设电气特性到高精度ADC与Flash应用
  • K20微控制器电气规格深度解析:从VREF到通信接口的硬件设计实践
  • 从“对话”到“执行”:企业级AI智能体如何重塑业务全链路闭环
  • 四步解决Xbox手柄在macOS上的连接与兼容问题:从基础到专家的完整指南
  • OmenSuperHub终极指南:三步掌握惠普游戏本性能完全控制权
  • i.MX 6UltraLite时序参数深度解析:从手册到稳定嵌入式设计的实战指南
  • MC68HC908AT32时钟系统:PLL低功耗管理与滤波电容选型实战
  • 别再死记硬背了!用Python代码手把手带你玩转A*算法(附扫地机器人实战源码)
  • 工业级齿轮缺陷YOLO数据集:500张高清图+7类标注+训练验证测试划分+可视化脚本
  • 深入解读NXP Kinetis K61芯片手册:从电气参数到稳定嵌入式设计
  • i.MX 7ULP接口时序深度解析:从理论到硬件设计与驱动配置实战
  • 计算机毕业设计之 智能零售柜商品识别系统
  • Havenlon 系统术语解读:从信任到执行控制
  • 如何告别复杂宏命令:魔兽世界智能宏系统终极指南
  • 微信聊天记录备份工具:如何安全掌控你的数字记忆
  • BIOS更新真能救活你的高频内存条?实测微星Z690主板升级0603版BIOS后,DDR4 4000 XMP终于稳了
  • 淘宝京东商品评论自动采集与情感倾向分析工具(含爬虫+模型+可视化界面)
  • 毕业答辩PPT还在通宵改?这三款AI生成神器一键搞定,还送答辩稿+答辩对策+问答库!
  • 解密游戏资源:5步掌握QuickBMS高效提取技巧
  • 国内咨询公司盘点:民企合规经营为何成为长效发展基石
  • 我用 Python 搭了一套知识管理系统:从零散笔记到结构化知识库,AI 帮我自动整理
  • 3个技巧让你的Slick轮播导航点从普通变惊艳
  • Keyviz:实时键鼠可视化工具终极指南 - 让操作透明化的专业解决方案
  • 小程序毕设选题推荐:基于微信小程序/安卓App的宠物社区系统设计与实现基于Android的宠物社区app设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 告别Fleet,手把手教你独立部署Elastic Agent 8.0监控Nginx日志(macOS实战)
  • IDEA弹窗提示File Cache Conflict?别慌,这其实是Maven/IDEA的‘抢文件’大战
  • Adobe-GenP 3.0终极指南:5分钟快速解锁Adobe全家桶
  • 开发者社区生态深度解析:从Discord技术社区看开源协作的未来
  • 短视频运营必备:视频号竞品账号数据分析的一种实现思路