HDU 1217 Arbitrage

来源:互联网 发布:注册公司 知乎 编辑:程序博客网 时间:2024/06/01 20:49

题意:给你n种货币,再给你m种保证每个货币能换成其他的货币,其中  两个货币之中给你它们的汇率。要你求出能不能找到一种兑换的方式,使得最后兑换为起始的货币,使得自己赚钱了


思路:这个题目也是一个建图的模型。可以假设出,从某点出发,回到原点,自己的价值还增大了,所以只需要汇率的乘积到起始点的时候大于1就可以了。所以,明显的Floyd算法。

AC代码:

#include<cstdio>#include<cstring>#include<map>#include<string>#include<algorithm>using namespace std;double str[31][31];map<string,int >hash;//用映射可以找到简单情况时是否成立//还可以把货币点转化为特定的数字,比如RMB可以作为1号钱币int n,m;void Floyd(){    int i,j,k;    double flag=-1;    for(k=1;k<=n;k++)        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                str[i][j]=max(str[i][j],str[i][k]*str[k][j]);            }    for(i=1;i<=n;i++)        flag=max(flag,str[i][i]);    if(flag>1)printf("Yes\n");    else        printf("No\n");}int main(){    int i,j,k;    int cnt=1;    char s[31];    while(scanf("%d",&n)!=EOF)    {        getchar();        int tot,flag;        if(n==0)break;        memset(str,0,sizeof(str));        hash.clear();       //没初始化就错了        flag=tot=0;        for(i=1; i<=n; i++)        {            scanf("%s",s);            if(!hash[s]) hash[s]=++tot;//将货币给一个代号        }        scanf("%d", &m);        for(i= 1; i<=m;i++)        {            double a;            char str1[31], str2[31];            scanf("%s%lf%s",str1,&a,str2);            int x=hash[str1];            int y=hash[str2];            str[x][y]=a;            if(x==y&&a>1)flag=1;        }        printf("Case %d: ",cnt++);        if(flag)            printf("Yes\n");        else            Floyd();    }    return 0;}


0 0
原创粉丝点击