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;
    }
  • 相关阅读:
    internet信息服务(iis)无法删除的解决方法
    JQuery和ASP.NET分别实现级联下拉框效果
    解决为应用程序池 提供服务的进程关闭时间超过了限制
    VS2015|Visual Studio Enterprise 2015简体中文版(企业版)
    ASP.NET MVC 4 (十) 模型验证
    基于.NET平台常用的框架整理
    业务逻辑层的设计(三)——事务的考虑
    业务逻辑层的设计(二)——让领域模型支持验证
    业务逻辑层的设计(一)——逻辑是谁的职责
    添加<!doctype html>后造成JS写的定位失效
  • 原文地址:https://www.cnblogs.com/syhandll/p/4813703.html
Copyright © 2011-2022 走看看