zoukankan      html  css  js  c++  java
  • hdu 1217:Arbitrage(floyd)

    题目大意

    货币间有一定的汇率可以相互兑换,

    给出n种货币并告诉m条各货币间的汇率,

    看这些货币中能否有一种可以通过一系列的兑换而增加。 如果是可行的,那么就输出Yes,否则输出No

    博客排版好难啊,就这么将就吧

    理性(瞎JB)分析:

    因为汇率就是从一单位的本体开始乘

    一直乘到兑换成自己为止

    又要让这一个单位变多 所以直接上啊

    即: 能否使一单位该货币经一系列兑换后大于一单位

    然后因为这道题的n很小,所以直接用floyd也没关系

    30x30x30 = 27000, 小的可怜嘛 代码的话,注释已经非常详细了

    # include <iostream>
    # include <string>
    # include <map>
    # include <cstdio>
    # include <cstring>
    using namespace std;
    int n, m;//n种货币,m条兑换 
    map<string, int> mp ;//为每种货币编号 
    double d[100][100];//用来储存 i -> j 的总汇率,即:将每条兑换的汇率相乘所得积 
    int cnt = 1; //用以计数 Case的序号 
    
    char a[35]; 
    char from[35], to[35]; //为避免string必须用cin而有可能导致超时的情况,全部使用char数组 
    double val;//当前汇率,没必要全部存下来,反正都存在d[][]里面了 
    
    void floyd(){
        for(int k = 0; k < n; k++)
            for(int i = 0; i < n; i++)
                for(int j = 0; j < n; j++)
                    if(d[i][j] < d[i][k] * d[k][j]) 
                    //如果当前 i -> j的总汇率比新的低,则替换   
                    //汇率高意味着一个单位的货币能兑换更多 
                        d[i][j] = d[i][k] * d[k][j];  
                        //floyd标准算法框架,注意本题是汇率,所以相乘而不是相加 
    
        for(int i = 0; i < n; i++)  //将所有货币遍历一遍 
            if(d[i][i] > 1.0){ //如果有货币在更新了后本身兑换本身的汇率大于 1.0,则能够套利 
                printf("Case %d: Yes
    ", cnt++);
                return ;
            }
    
        printf("Case %d: No
    ", cnt++);
        return ;
    }
    
    int main(){
        while(~scanf("%d", &n), n){
            memset(d, 0, sizeof(d)); // 处理每组样例时将d[][]初始化 
    
            for(int i = 0; i < n; i++){         
                scanf("%s", a);
                mp[a] = i;  //为货币编号 
            }
            scanf("%d", &m);    
            for(int i = 0; i < m; i++){
                scanf("%s%lf%s", from, &val, to); 
                //字符串用 s, double类型用 lf 
                //char数组的名字是一个指针,所以不用加 &
                //即对char a[] : &a[0] = a 
                d[mp[from]][mp[to]] = val; //保存各货币间的汇率 
            }
            floyd();//处理 
    
        }
    
        return 0;
    }
    
    
  • 相关阅读:
    亚马逊云服务器VPS Amazon EC2 免费VPS主机配置CentOS及其它内容
    Linux + Mono 目前已经支持Entity Framework 6.1
    CentOS上 Mono 3.2.8运行ASP.NET MVC4经验
    Linux CentOS下如何确认MySQL服务已经启动
    C#使用Timer.Interval指定时间间隔与指定时间执行事件
    MySQL数据库有外键约束时使用truncate命令的办法
    C++中字符和字符串的读取与使用
    结构体的运算符重载
    P1358 扑克牌
    P1284 三角形牧场
  • 原文地址:https://www.cnblogs.com/Yuukoui/p/9412261.html
Copyright © 2011-2022 走看看