zoukankan      html  css  js  c++  java
  • 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;

    } 

  • 相关阅读:
    AM335x kernel 4.4.12 i2c eeprom AT24c02驱动移植
    AM335x tscadc platform driver 相关代码跟踪
    Linux kernel make 常用选项介绍
    Linux kernel 文件夹说明
    shell 脚本之获取命令输出字符串以及函数参数传递
    Treeview控件如何获得子节点的所有父节点的名称
    浅谈Delphi高效使用TreeView
    Delphi下Treeview控件基于节点编号的访问
    delphi中TTreeView的使用方法
    学习 TTreeView [2]
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4656231.html
Copyright © 2011-2022 走看看