• 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;
    }
  • 相关阅读:
    Ch’s gift HDU
    String HDU
    Rikka with String HDU
    DNA repair HDU
    Ring HDU
    A Secret HDU
    看详细的tomcat报错信息
    linux tomcat服务器优化配置
    linux常用命令
    关于Context []startup failed due to previous errors有效解决方式
  • 原文地址:https://www.cnblogs.com/syhandll/p/4813703.html
Copyright © 2020-2023  润新知