zoukankan      html  css  js  c++  java
  • HDOJ 1217 Arbitrage (最短路)

    题意:每两种货币之间都有不同的汇率  如果换回自己最后是赚的 输出Yes 否则是No

    因为最多只有三十种货币 所以用Floyd是可行的 与一般的最短路板子不同的地方 汇率是要乘而不是加 如果乘上一个小于1的数就会比之前小

    将每种货币看作点 汇率建边 如果这两种货币不能兑换 就设为0 最后与自己判断是否大于1 如果是 则存在套利 如果不是就不存在

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    int n,m,x,y,id=1;
    double tmp;
    char a[35],b[35];
    char s[35][50];
    double mp[35][35];
    
    void floyd(){
        int flag=0;
        for(int k=0;k<n;k++)
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    if(mp[i][j]<mp[i][k]*mp[k][j])
                        mp[i][j]=mp[i][k]*mp[k][j];
        for(int i=0;i<n;i++){
            if(mp[i][i]>1){
                flag=1;break;
            }
        }
        if(flag) printf("Case %d: Yes
    ",id);
        else printf("Case %d: No
    ",id);
        id++;
    }
    
    int main(){
        while(~scanf("%d",&n)){
            if(n==0) break;
            memset(mp,0,sizeof(mp));
            for(int i=0;i<n;i++){
                scanf("%s",s[i]);
            }
            scanf("%d",&m);
            while(m--){
                scanf("%s%lf%s",a,&tmp,&b);
                for(int j=0;j<n;j++){
                    if(strcmp(a,s[j])==0){
                        x=j;
                        break;
                    }
                }
                for(int j=0;j<n;j++){
                    if(strcmp(b,s[j])==0){
                        y=j;
                        break;
                    }
                }
                mp[x][y]=tmp;
            }
            floyd();
        }
        return 0;
    }
    View Code
  • 相关阅读:
    土法炼钢:怎么实现一个简单的B+Tree In-Disk
    panguan(判官):一个自研的任务执行引擎的工程实践
    团队源代码管理
    测试——俄罗斯方块
    测试——连连看
    测试——食物链教学小工具
    测试——约跑APP
    beta-review阶段贡献分分配
    第十周PSP&进度条
    吉林市一日游
  • 原文地址:https://www.cnblogs.com/whdsunny/p/9572096.html
Copyright © 2011-2022 走看看