当前位置: 首页 > 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.jsqmd.com/news/982977/

相关文章:

  • ARM Cortex-M4 MCU实战:K20系列低功耗与高性能嵌入式设计指南
  • i.MX 93高速接口时序设计:HS200/SDR104与RGMII的硬件避坑指南
  • 有哪些AI论文写作软件是真的契合专业内容,而不是通用套壳?
  • IDM永久激活完整指南:安全免费解锁下载神器
  • AI 应用基础设施构建:可观测性体系如何让大模型服务“透明运行“
  • PPPwn深度技术解析:从FreeBSD内核漏洞到PlayStation 4远程代码执行
  • 再见Navicat!高颜值、内置 AI,这款开源的数据库工具杀疯了。。
  • 微信小程序反编译技术深度解析:wxapkg-convertor实战指南
  • 嵌入式设计核心:从K12外设电气特性到高精度ADC与Flash应用
  • K20微控制器电气规格深度解析:从VREF到通信接口的硬件设计实践
  • GitCode个人技术开发者总结完整使用指南
  • Vue+Spring Boot双端可运行的学生信息管理项目(含前后端独立模块与启动说明)
  • 终极指南:如何轻松解密和提取RPG Maker游戏资源文件
  • 给到夯,Claude Code重磅更新:Auto Mode 与 ultracode 是个什么东西
  • MC68HC908MR24 ADC数据寄存器与时钟配置实战解析
  • 嵌入式硬件设计:Kinetis K53引脚复用与LQFP/MAPBGA封装对比实战
  • 从“对话”到“执行”:企业级AI智能体如何重塑业务全链路闭环
  • 小米把 1T 模型干到 1000 TPS?这事 Groq 看了得沉默
  • 四步解决Xbox手柄在macOS上的连接与兼容问题:从基础到专家的完整指南
  • 告别CNN与RNN:用SpectralFormer(Transformer)为高光谱图像分类打开新思路
  • 从WebLogo到MEME:手把手教你挖掘多序列比对结果中的保守区域与功能基序
  • NXP IW623P Wi-Fi 6/蓝牙5.x组合芯片硬件设计与调试实战指南
  • OmenSuperHub终极指南:三步掌握惠普游戏本性能完全控制权
  • WechatBakTool:基于C的微信聊天记录备份与数据库解密技术方案
  • 【零基础实操】 五分钟完成 OpenClaw 可视化部署配置(含安装包)
  • 高校掌纹识别课程实践包:PCA降维+CNN分类+多模型融合全流程Python代码
  • 3分钟掌握Borderless Gaming:告别游戏窗口边框的终极解决方案
  • 我测了 6 个大模型写中文文章:GPT-4 vs Claude vs DeepSeek vs 通义千问 vs Kimi vs 豆包,谁最像人写的
  • 专业数据可视化工具实战指南:3步创建交互式图表
  • 【嵌入式必知】内联函数(inline)和宏定义(#defne)