-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
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.
输入
-
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.
输出
- For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No". 样例输入
-
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
样例输出
-
Case 1: Yes Case 2: No
注意string的录入使用cin,并且比较函数为compare
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int casenum;
int n, m;
string curr[35];
float exchange[35][35];
//注意string输入只能使用cin,并且比较函数为compare,头文件为string
int main()
{
ios::sync_with_stdio(false);
cin >> n;
while(n != 0)
{
casenum++;
for(int i = 1; i <= n; i++)
cin >> curr[i];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i == j)
exchange[i][i] = 1.0;
else
exchange[i][j] = 0.0;
cin >> m;
string a, b;
int x, y;
float ex;
while(m--)
{
cin >> a >> ex >> b;
for(int i = 1; i <= n; i++)
{
if(a.compare(curr[i]) == 0)
x = i;
if(b.compare(curr[i]) == 0)
y = i;
}
exchange[x][y] = ex;
}
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
float t = exchange[i][k] * exchange[k][j];
if(t > exchange[i][j])
exchange[i][j] = t;
}
}
}
bool flag = false;
for(int i = 1; i <= n; i++)
{
if(exchange[i][i] > 1)
{
flag = true;
break;
}
}
if(flag)
cout << "Case " << casenum << ": Yes" << endl;
else
cout << "Case " << casenum << ": No" << endl;
cin >> n;
}
return 0;
}