POJ 2240 Arbitrage(Floyd)
http://poj.org/problem?id=2240
题意:给你一些货币比如A,B,C,然后给你他们之间存在的对换关系,如A可以换0.5个B,B可以换10个C,C可以换2个A等.然后问你是否存在一种对换可以使得1个A可以换到大于1个A的钱.
分析:
首先把每个货币的单词映射成一个数字,表示该货币的编号.然后其实本题用到了类似Floyd的动态规划思想.
首先假设货币1对换货币2 比率为a,货币2对换货币3 比率为b.
那么货币1对换货币3比率为多少呢?
为a*b.
现在我们希望货币能增值,所以如果货币1换货币3 有两种比率分别为0,5和0,6.那么我们明显放弃0.5那个,只需要用0.6的比率即可.所以这道题就成了求一个有向图的任意两点的最大兑换比例,不过这个比例不是相加运算了,而是相乘运算.
且现在不是最小值最优了,而是最大值最优了. 其实原理就是Floyd的动态规划原理.其实就是传递闭包,证明省略,可以参考Floyd的证明过程.
AC代码:
#include<cstdio>
#include<map>
#include<iostream>
#include<string>
using namespace std;
const int maxn= 30+5;
int n,m;
double d[maxn][maxn];
void init()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j]= i==j?1.0:0; //为0则表示不可兑换
}
void floyd()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(d[i][j] < d[i][k] * d[k][j])
d[i][j] = d[i][k]*d[k][j];
}
int main()
{
int kase=0;
while(scanf("%d",&n)==1&&n)
{
map<string,int> mp;
for(int i=0;i<n;i++)
{
string s;
cin>>s;
mp[s]=i;
}
init();
scanf("%d",&m);
for(int i=0;i<m;i++)
{
string s1,s2;
double val;
cin>>s1>>val>>s2;
d[mp[s1]][mp[s2]] = val;
}
floyd();
int i;
for(i=0;i<n;i++)
if(d[i][i]>1.0) break;
if(i==n) printf("Case %d: No\n",++kase);
else printf("Case %d: Yes\n",++kase);
}
return 0;
}
分享到:
相关推荐
北大POJ2240-Arbitrage【Floyd】 解题报告+AC代码
Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 ...
北大POJ2253-Frogger【Floyd】 解题报告+AC代码
北大POJ1125-Stockbroker Grapevine【Floyd】 解题报告+AC代码
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序 (poj1094) (5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020) ...
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
北大POJ1159-Palindrome 解题报告+AC代码
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
poj分类poj分类poj分类poj分类
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
北大POJ2002-Squares 解题报告+AC代码
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
POJ1048,加强版的约瑟夫问题 难度中等
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类