zoukankan      html  css  js  c++  java
  • POJ

    题目链接:http://poj.org/problem?id=2240

     
    Sample Input
    
    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
    
    0
    Sample Output
    
    Case 1: Yes
    Case 2: No

    题意: 问你能不能找到一个圈,使沿着这个圈兑换钱币后钱数增加。

    路径为汇率,由于自环汇率是1,因此,我们要找一个圈作用的结果大于1。因为题目给得很清楚,是边边相乘,于是就是路径松弛的时候改成相乘就可以了。

    分析:最短路flody。依旧是字符串转换需要注意,然后汇率相乘的,如果自身到自身大于1了,就说明Yes,否则,No。

     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stack>
     6 #include<math.h>
     7 #include<queue>
     8 #include<map>
     9 using namespace std;
    10 
    11 ///map可以理解为一个一对一的key,value对,也叫做键值对
    12 ///通常用于快速寻找一个key的对应的value是多少
    13 ///map<key,value>mymap; mymap[key]=value;
    14 
    15 #define INF 0x3f3f3f3f
    16 #define N 1200
    17 
    18 double maps[N][N];
    19 int n;
    20 
    21 void Init()
    22 {
    23     for(int i=0;i<n;i++)
    24         for(int j=0;j<n;j++)
    25         if(i==j)
    26         maps[i][j]=1;
    27         else
    28         maps[i][j]=-INF;
    29 }
    30 
    31 void flody()
    32 {
    33     int i,j,k;
    34     for(k=0;k<n;k++)
    35         for(i=0;i<n;i++)
    36         for(j=0;j<n;j++)
    37         if(maps[i][j]<maps[i][k]*maps[k][j])
    38         maps[i][j]=maps[i][k]*maps[k][j];
    39 }
    40 
    41 int main()
    42 {
    43     int t=1,i,m,kk;
    44     double l;
    45     map<string,int> mp;
    46     char s[N],str[N];
    47 
    48     while(scanf("%d", &n), n)
    49     {
    50         kk=0;
    51         Init();
    52         for(i=0;i<n;i++)
    53         {
    54             scanf("%s", s);
    55             mp[s]=kk;
    56             kk++;
    57         }
    58 
    59         scanf("%d", &m);
    60 
    61         for(i=0;i<m;i++)
    62         {
    63             scanf("%s%lf%s", s,&l,str);
    64             maps[mp[s]][mp[str]]=l;
    65         }
    66 
    67         flody();
    68         int f=0;
    69         for(i=0;i<n;i++)
    70             if(maps[i][i]>1)
    71             f=1;
    72 
    73         if(f==1)
    74             printf("Case %d: Yes
    ",t++);
    75         else
    76             printf("Case %d: No
    ",t++);
    77     }
    78     return 0;
    79 }

    另外附上一个没有使用map函数的代码,字符串的处理部分可以借鉴学习。

     1 #include<iostream>
     2 #include<string.h>
     3 #include<cmath>
     4 using namespace std;
     5 
     6 int n,m,l=0;
     7 
     8 char a[40][50];
     9 
    10 int loc(char t[])
    11 {
    12     int i;
    13     for(i=1;i<=n;i++)
    14     {
    15         if(strcmp(t,a[i])==0)
    16         {
    17             return i;
    18         }
    19     }
    20     return -1;
    21 }
    22 
    23 void floyd(double b[][50])
    24 {
    25     int i,j,k;
    26     for(i=1;i<=n;i++)
    27     {
    28         for(j=1;j<=n;j++)
    29         {
    30             for(k=1;k<=n;k++)
    31             {
    32                 if(b[j][k]<b[j][i]+b[i][k])
    33                 {
    34                     if(j==k&&pow(10,b[j][k])>1)
    35                     {
    36                         cout<<"Case "<<l<<": Yes"<<endl;
    37                         return;
    38                     }
    39                     b[j][k]=b[j][i]+b[i][k];
    40                 }
    41             }
    42         }
    43     }
    44     cout<<"Case "<<l<<": No"<<endl;
    45 }
    46 
    47 int main()
    48 {
    49     int i,j;
    50     char c[50],d[50];
    51     double w;
    52     while(cin>>n,n!=0)
    53     {
    54         double b[50][50]={0};
    55         l++;
    56         for(i=1;i<=n;i++)
    57         {
    58             cin>>a[i];
    59         }
    60         cin>>m;
    61         for(i=1;i<=m;i++)
    62         {
    63             cin>>c>>w>>d;
    64             b[loc(c)][loc(d)]=log10(w);
    65         }
    66 //         for(i=1;i<=n;i++)
    67 //         {
    68 //             for(j=1;j<=n;j++)
    69 //             {
    70 //                 cout<<b[i][j]<<" ";
    71 //             }
    72 //             cout<<endl;
    73 //         }
    74         floyd(b);
    75     }
    76     return 0;
    77 } 
  • 相关阅读:
    XTU 1250 Super Fast Fourier Transform
    XTU 1249 Rolling Variance
    XTU 1243 2016
    CodeForces 710A King Moves
    CodeForces 710B Optimal Point on a Line
    HDU 4472 Count
    并查集
    高精度四件套
    Kruskal最小生成树
    [蓝桥杯]翻硬币(贪心的详解附带题目测试链接)
  • 原文地址:https://www.cnblogs.com/weiyuan/p/5726822.html
Copyright © 2011-2022 走看看