• I


    题目大意:套汇
    套利是使用货币汇率的差异将一个单位的货币转换为多个相同的货币单位,例如1美元可以买0.5英镑,1英镑可以买10法郎,1法郎可以买0.21美元,然后聪明的人经过一些列兑换可以得到 1*0.5*10*0.21 = 1.05美元,盈利百分之5,你的工作就是判断是否能套汇成功(不得不说这个描述简介漂亮,没有一句废话)。
    /////////////////////////////////////////////////////////////
    这道题有点类似以前做过的汇率问题,不过没有指定哪一个是自己持有的货币,估计可以是任意一种能变多都行,试一下吧,用每一个货币都试试,反正最多30种,也不算多
    方法没错,不过消耗的时间比较多,应该是map比较耗时,以后小心map
    #include<algorithm>
    #include<queue>
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    #include<string>
    #include<map>
    #include<iostream>
    using namespace std;

    const int maxn = 50;
    const int oo = 0xfffffff;
    const double StartMoney = 100;

    struct node
    {
        int y;
        double rate;
        node(int y, double r):y(y), rate(r){}
    };
    vector<node> G[maxn];
    double v[maxn];

    void Initialization(int s, int N)//初始化变量
    {
        for(int i=1; i<=N; i++)
            v[i] = -oo;

        v[s] = StartMoney;
    }
    int  Spfa(int s)
    {
        queue<int> Q;
        Q.push(s);

        while(Q.size())
        {
            int i = Q.front();Q.pop();
            int len = G[i].size();

            for(int j=0; j<len; j++)
            {
                node q = G[i][j];
                double k = v[i] * q.rate;

                if(k > v[q.y])
                {
                    v[q.y] = k;
                    Q.push(q.y);
                }
            }

            if(v[s] > StartMoney)
                return 1;
        }

        return 0;
    }

    int  main()
    {
        int N, M, t=1;

        while(scanf("%d", &N), N)
        {
            int i;
            double r;
            string A, B;
            map<stringint> a;

            for(i=1; i<=N; i++)
            {
                cin >> A;
                a[A] = i;
            }

            scanf("%d", &M);

            for(i=1; i<=M; i++)
            {
                cin >> A >> r >> B;
                int x = a[A], y = a[B];
                G[x].push_back(node(y, r));
            }

            for(i=1; i<=N; i++)
            {
                Initialization(i, N);
                if(Spfa(i) == 1)
                    break;
            }

            if(i <= N)
                printf("Case %d: Yes ", t++);
            else
                printf("Case %d: No ", t++);

            for(i=1; i<=N; i++)
                G[i].clear();
        }

        return 0;

    } 

  • 相关阅读:
    区分/不区分大小写的比较,查找字符串在另一字符串中的位置,字符串开头是否包括另一字符串 hasPrefix
    获取文件名以及后缀
    监听Documents文件夹内文件发生改变
    根据路径获取文件大小
    获取视频第一帧的方法
    判断图片格式
    iTunes文件共享
    iOS 10 隐私权限设置
    uCos 学习:0-有关概念
    ALSA 有关文档
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4656231.html
Copyright © 2020-2023  润新知