首页 > 代码库 > HDU 1217 Arbitrage
HDU 1217 Arbitrage
题意:给你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; }
HDU 1217 Arbitrage
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。