您的位置:首页 > 其它

hdoj 1217 Arbitrage(floyd+处理名字为字符串的情况)

2016-02-02 02:26 429 查看

Arbitrage

[align=left]Problem Description[/align]
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.

[align=left]Input[/align]
The input file 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.

[align=left]Output[/align]
For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".

[align=left]Sample Input[/align]

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


[align=left]Sample Output[/align]

Case 1: Yes
Case 2: No


[align=left]Source[/align]
University of Ulm Local
Contest 1996

这样写比map快很多!!!
#include"stdio.h"
#include"string.h"
struct node
{
char name[33];
}E[33];
int main()
{
double map[31][31];
double ans[31][31];
double t;
char temp[33];
int k,n,m,k1,k2,i,j,Case=1;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
scanf("%s",E[i].name);
scanf("%d",&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)
map[i][j]=1;
else
map[i][j]=0;
}
for(i=1;i<=m;i++)
{
scanf("%s",temp);
for(k1=1;k1<=n;k1++)
if(strcmp(E[k1].name,temp)==0)
break;
scanf("%lf",&t);
scanf("%s",temp);
for(k2=1;k2<=n;k2++)
if(strcmp(E[k2].name,temp)==0)
break;
map[k1][k2]=t;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
ans[i][j]=map[i][j];
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(ans[i][j]<ans[i][k]*ans[k][j])
ans[i][j]=ans[i][k]*ans[k][j];
}
}
if(ans[1][1]>1)
printf("Case %d: Yes\n",Case++);
else
printf("Case %d: No\n",Case++);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: