Arbitrage

思路

货币套汇意思是通过不同币种的转换,最后换回当前货币,得到总量有增加,就说明有套汇的可能,即刚开始手上有1美元,然后用这1美元去换人民币,大概是6.7元左右,再将这换过来的人民币换回美元,由于汇率关系不是严格的倒数关系,最后到手的美元可能大于1美元,就说明有套汇的可能。
首先对货币名称存储方式有两种方法,一种是用map,它会自动分配一个序号给该字符串,二种是用一个string数组,按照顺序存储字符串,和普通数组一样。
然后用二维数组存储相应币种之间的汇率,初始将a[i][i]赋为1,以货币名称为点,汇率为线,转换关系为乘法,即a[i][j]=a[i][k]*a[k][j]。输入会给出a[i][0]和a[0][i],然后根据他们求出其他的a[i][j],最终判断二维矩阵当i=j时,若有a[i][j]>1,说明有套汇的可能。
本题的数据存储也是个问题,由于本人不会用map,所以用字符串数组来代替,还好数据不是很大,没有报错。

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    int n,h=0;
    while(cin>>n){
        h++;
        if(n==0) return 0;
        else{
            int i,j,m,k,g;
        double a[31][31],rate;
        string str[31];
        string str1,str2;
        for(i=1;i<=n;i++){
            cin>>str[i];
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(i==j){
                a[i][j]=1;
            }else{
                a[i][j]=0;
            }
        }
        }
        cin>>m;
        for(i=1;i<=m;i++){
            cin>>str1>>rate>>str2;
            for(j=1;j<=n;j++){
                if(str[j]==str1)
                k=j;
            if(str[j]==str2)
            g=j;
                }
            a[k][g]=rate;
            for(j=1;j<=n;j++)
            {
                for(k=1;k<=n;k++){
                    for(g=1;g<=n;g++){
                        if(a[j][g]<a[j][k]*a[k][g])
                        a[j][g]=a[j][k]*a[k][g];
                    }
                }
            }
        }
        int flag=0;
        for(i=1;i<=n;i++){
            if(a[i][i]>1){
                cout<<"Case "<<h<<' '<<"Yes"<<endl;
                flag++;
                break;
            }
        }
        if(flag==0)
        cout<<"Case "<<h<<' '<<"No"<<endl;
        }
}
}

results matching ""

    No results matching ""