正文

Zju 1092 Arbitrage2006-08-14 23:33:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/17580.html

分享到:

2021578 2006-08-14 23:10:47 Accepted 1092 C++ 00:00.37 856K St.Crux

输出的时候犯了一个小错误:"Yes"当作“YES”了。

这个题是很基础的最短路径题,不限次数倒买倒卖,求能否过一定的收益率(这里为1)。我记得uva上有一个题是问在t次交换内能否达到一定的汇率......那样似乎还要记录路径了......上次学校里搞选拔赛的时候做过,做不出。现在还是做不出 TAT

另,memset(a, 0, sizeof(a))对double数组无效。但可以写memset(a, 0x00, sizeof(a))

#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <map>
using namespace std;

double a[30][30];
map<string, int> sm, dm;
int n, c = 0, ac;

int main()
{
 //ifstream cin("in.txt");
 while(cin >> n && n)
 {
  sm = dm;  
  int i, k, t, j;
  for(i = 0; i < n; i ++)
  {
   string s;
   cin >> s;
   sm[s] = i;
   for(k = 0; k < n; k ++)
   {
    a[i][k] = 0;  //清零
   }
  }
  cin >> t;
  for(i = 0; i < t; i ++)
  {
   string s0, s1; double td;
   cin >> s0 >> td >> s1;
   a[sm[s0]][sm[s1]] = td;
  }
  //pt();
  for(j = 0; j < n; j ++)
  {
   for(i = 0; i < n; i ++)
   {
    for(k = 0; k < n; k ++)
    {
     if(a[i][j] * a[j][k] > a[i][k])
      a[i][k] = a[i][j] * a[j][k];    //Floyd
    }
   }
  }
  //pt();
  ac = 0;
  for(i = 0; i < n; i ++)
  {
   if(a[i][i] > 1)
   {
    ac = 1;
    break;
   }
  }
  printf("Case %d: ", ++ c);
  if(ac)
   printf("Yes\n");
  else
   printf("No\n");
 }
 return 0;
}

阅读(3935) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册