hdu 1217 Arbitrage
2015-07-22 15:41
239 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1217
Arbitrage
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Submit Status
Description
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 British pound, 1 British pound buys 10.0 French francs, and 1 French
franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.
Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.
Input
The input will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear.
The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency.
Exchanges which do not appear in the table are impossible.
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.
Output
For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".
Sample Input
Sample Output
Arbitrage
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Submit Status
Description
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 British pound, 1 British pound buys 10.0 French francs, and 1 French
franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.
Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.
Input
The input will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear.
The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency.
Exchanges which do not appear in the table are impossible.
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.
Output
For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".
Sample Input
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 BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Sample Output
Case 1: Yes Case 2: No
这是一个货币交换问题,就是问你货币交换之后能不能赚到钱,用num函数将下标由字符串转换为数字,g 表示两种货币之间的汇率
参考别人的代码
<pre name="code" class="cpp">#include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <limits> #include <queue> #include <stack> #include <vector> #include <map> using namespace std; #define N 1100 #define INF 0x3f3f3f3f #define PI acos (-1.0) #define EPS 1e-8 int n, m; char s ; double g ; int num (char ss[]); //判断与前边的字符串是否相等 void Floyd (); int main () { char s1 , s2 ; double t; int flag = 1; while (cin >> n, n) { getchar (); for (int i=1; i<=n; i++) gets (s[i]); cin >> m; memset (g, 0, sizeof (g)); for (int i=1; i<=m; i++) { cin >> s1 >> t >> s2; g[num(s1)][num(s2)] = t; } cout << "Case " << flag++ << ": "; Floyd (); } return 0; } void Floyd () { for (int k=1; k<=n; k++) { for (int i=1; i<=n; i++) { for (int j=1; j<=n; j++) { if (g[i][k] * g[k][j] > g[i][j]) g[i][j] = g[i][k] * g[k][j]; if (i == j && g[i][j] > 1)//如果交换后金额大于之前 { puts ("Yes"); return; } } } } puts ("No"); } int num (char ss[]) { for (int i=1; i<=n; i++) if (!strcmp (ss, s[i])) return i; }
相关文章推荐
- web.xml路径匹配原则
- Linux系统防止黑客NMAP扫描的方法
- flume-ng+Kafka+Storm+HDFS 实时系统搭建
- Spark学习体系整理(基础篇、中级篇、高级篇所涉及内容)
- Android官方技术文档翻译——ApplicationId 与 PackageName
- C语言的inline(转载)
- ACM学习历程—HDU 1272 小希的迷宫(并查集)
- 激活任务栏的托盘程序窗口[特殊情况下使用]
- Responder Chain 响应者链总结
- RPC学习----Thrift快速入门和Java简单示例
- LeetCode Rotate Image旋转图像
- 缓存统一管理工具类--android
- Linux read()函数
- 简单项目中打开
- Flume NG 简介及配置实战
- SIFT算法详解
- CSS3中动画属性transform、transition 和 animation
- Apache与Tomcat
- java如何下载文件
- Android中ListView的使用