算法设计与分析: 4-15 套汇问题

4-15 套汇问题


问题描述

套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货 币。例如,假定 1 美元可以买 0.7 英镑,1 英镑可以买 9.5 法郎,且 1 法郎可以买到 0.16 美元。通过货币兑换,一个商人可以从 1 美元开始买入,得到 0.7×9.5×0.16=1.064 美元, 从而获得 6.4%的利润。

给定 n 种货币 c 1 , c 2 , . . . , c n 的有关兑换率,试设计一个有效算法,用以确定是否存在套汇的可能性。

含多个测试数据项。每个测试数据项的第一行中只 有 1 个整数 n (1<=n<=30),表示货币总数。其后 n 行给出 n 种货币的名称。接下来的一行中 有 1 个整数 m,表示有 m 种不同的货币兑换率。其后 m 行给出 m 种不同的货币兑换率,每 行有 3 个数据项 c i r i j c j ,表示货币 c i c j 的兑换率为 r i j


Java

import java.util.Scanner;

public class TaoHui {

    private static int n,edges;
    private static String[] name;
    private static double[][] r;
    private static String a,b;
    private static double x;
    private static int cases = 0;

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        while (true){
            cases++;
            int i,j,k;
            n = input.nextInt();

            name = new String[n];
            r = new double[n][n];

            if(n == 0) break;
            for(i=0; i<n; i++)
                name[i] = input.next();

            for(i=0; i<n; i++)
                for(j=0; j<n; j++)
                    r[i][j] = 0.0;

            edges = input.nextInt();
            for(i=0; i<edges; i++){
                a = input.next();
                x = input.nextDouble();
                b = input.next();
                for(j=0; !a.equals(name[j]); j++);
                for(k=0; !b.equals(name[k]); k++);
                r[j][k] = x;
            }

            for(i=0; i<n; i++)
                r[i][i] = max(1.0,r[i][i]);

            for(k=0; k<n; k++)
                for(i=0; i<n; i++)
                    for(j=0; j<n; j++)
                        r[i][j] = max(r[i][j],r[i][k]*r[k][j]);

            for(i=0; i<n; i++)
                if(r[i][i] > 1.0)
                    break;

            if(i < n)
                System.out.println("case "+cases+" yes");
            else
                System.out.println("case "+cases+" no");
        }
    }

    private static double max(double a, double b){
        return a > b ? a : b;
    }
}

Input & Output

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

4
DM
FF
Schilling
Taler
12
DM 0.5 FF
DM 0.9 Schilling
DM 0.5 Taler
FF 0.5 DM
FF 0.5 Schilling
FF 0.9 Taler
Schilling 0.5 DM
Schilling 0.9 FF
Schilling 0.5 Taler
Taler 1.38 DM
Taler 0.5 FF
Taler 0.5 Schilling

case 1 yes
case 2 no
case 3 yes

Reference

王晓东《计算机算法设计与分析》

猜你喜欢

转载自blog.csdn.net/ioio_/article/details/81070510