POJ2240汇率转化计算

来源:互联网 发布:程序员 转行 投资 编辑:程序博客网 时间:2024/06/08 15:19
/*题意:几种不同的物品可以互相交换,但是交换的数量不同比如:1 单位 US        换 0.5  单位 British 1 单位 British   换 10.0 单位 French 1 单位 French    换 0.21 单位 US现在我们可以用    1单位US      换 0.5  单位British;再用这         0.5单位British 换 5    单位French再用             5单位French  换 1.05 单位US那么一开始的1单位的US现在就变成了1.05单位US;获利0.05US题目给出所有可供交换的物品和两种可以交换的物品之间的交换价格问是否可以通过交换获利*//*题解:先用map映照把不同的物品编号,再存入邻接矩阵邻接矩阵必须先初始化然后用floyd求出各个物品可以通过交换得到的最大值,再找出每个物品自身的交换后的价值,如果大于原来的价值就输出Yes;否则输出No*/#include<stdio.h>#include<map>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int main(){    map<string,int>m;               //map映照容器,用字符串映照数字int t,n,ans;int flag;int r=1;double mp[222][222];            //邻接矩阵用double型储存double x;    char str1[222],str2[222];           char str[222];while(scanf("%d",&n) && n){    for(int i=1; i<=n; i++)        {            scanf("%s",str);            m[str] = i;                         //输入字符串,确定映照的数字        }        for(int i=1; i<=n; i++)        {            for(int j=1; j<=n; j++)            {                if(i==j)                    mp[i][j] = 0.00;             //初始化邻接矩阵mp                else                    mp[i][j] = 1.00;            }        }       scanf("%d",&t);       for(int i=0; i<t; i++)       {           scanf("%s %lf %s",&str1,&x,&str2);       //储存路径               mp[m[str1]][m[str2]] = x;       }        //floyd       for(int i=1; i<=n; i++)       {          for(int j=1; j<=n; j++)          {            for(int k=1; k<=n; k++)            {              if(mp[j][k] < mp[j][i] * mp[i][k])              {                  mp[j][k] = mp[j][i]*mp[i][k];              }            }          }       }       printf("Case %d: ",r++);        flag = 0;        for(int i=1; i<=n; i++)        {            if(mp[i][i] > 1)                    //对比交换后的价值是否变大            {                flag = 1;                printf("Yes\n");                break;            }        }        if(!flag)            printf("No\n");}}
原创粉丝点击