zoukankan      html  css  js  c++  java
  • POJ 2240 Arbitrage

    Description:

    Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent. 

    Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not. 

    Input:

    The input will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear. The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency. Exchanges which do not appear in the table are impossible. 
    Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.

    Output:

    For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".

    Sample Input:

    3
    USDollar
    BritishPound
    FrenchFranc
    3
    USDollar 0.5 BritishPound
    BritishPound 10.0 FrenchFranc
    FrenchFranc 0.21 USDollar
    
    3
    USDollar
    BritishPound
    FrenchFranc
    6
    USDollar 0.5 BritishPound
    USDollar 4.9 FrenchFranc
    BritishPound 10.0 FrenchFranc
    BritishPound 1.99 USDollar
    FrenchFranc 0.09 BritishPound
    FrenchFranc 0.19 USDollar
    
    0
    

    Sample Output:

    Case 1: Yes
    Case 2: No

    题意:知道货币的名字和每两种货币兑换的利率,那么现在要判断当每种货币经过一系列兑换之后再次回到该种货币时价值是否增加。(和POJ 1860 Currency Exchange一样,只是要找到货币名称所对应的下标)
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    const int N=50;
    const int INF=0x3f3f3f3f;
    
    struct node
    {
        char s[110];
    }no[N];
    double G[N][N], dist[N];
    int vis[N], cou[N], n;
    
    void Init()
    {
        int i, j;
    
        for (i = 1; i <= n; i++)
        {
            dist[i] = -INF;
            vis[i] = cou[i] = 0;
            for (j = 1; j <= n; j++)
                G[i][j] = -INF;
            G[i][i] = 0;
        }
    }
    
    int Judge(char a[]) ///找到字符串a的下标
    {
        int i;
    
        for (i = 1; i <= n; i++)
        {
            if (strcmp(a, no[i].s) == 0)
                return i;
        }
    
        return -1;
    }
    
    int Spfa()
    {
        int i, v;
        queue<int>Q;
    
        Q.push(1);
        dist[1] = 1;
    
        while (!Q.empty())
        {
            v = Q.front(); Q.pop();
    
            for (i = 1; i <= n; i++)
            {
                if (dist[i] < dist[v]*G[v][i])
                {
                    dist[i] = dist[v]*G[v][i];
    
                    if (!vis[i])
                    {
                        Q.push(i);
                        vis[i] = 1;
                        cou[i]++;
                        if (cou[i] >= n) ///有回路代表货币价值增加,因为只有货币兑换后价值增加才会进行这一步
                            return 1;
                    }
                }
            }
    
            vis[v] = 0;
        }
    
        return 0;
    }
    
    int main ()
    {
        int i, j, m, ans, k = 0;
        char a[110], b[110];
        double d;
    
        while (scanf("%d", &n), n)
        {
            Init();
            k++;
    
            for (i = 1; i <= n; i++)
                scanf("%s", no[i].s);
            scanf("%d", &m);
            while (m--)
            {
                scanf("%s %lf %s", a, &d, b);
    
                i = Judge(a);
                j = Judge(b);
                G[i][j] = d;
            }
    
            ans = Spfa();
    
            if (ans) printf("Case %d: Yes
    ", k);
            else printf("Case %d: No
    ", k);
        }
    
        return 0;
    }
  • 相关阅读:
    《有限元分析基础教程》(曾攀)笔记二-梁单元方程推导(二):简支梁挠曲线近似解
    《有限元分析基础教程》(曾攀)笔记二-梁单元方程推导(一):简支梁挠曲线解析解
    接入TDMQ
    python 字典键值对练习
    python字典中键值对的值为中文,打印成转义字符,怎么解决
    python 字典的增删改
    C++ File 类学习总结
    The way of learning ,I am coming
    C++ Primer第四版 15.9 再谈文本查询 程序实现
    自己实现strtok函数
  • 原文地址:https://www.cnblogs.com/syhandll/p/4813703.html
Copyright © 2011-2022 走看看