思路
货币套汇意思是通过不同币种的转换,最后换回当前货币,得到总量有增加,就说明有套汇的可能,即刚开始手上有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;
}
}
}