hdu 1217/poj 2240 Arbitrage【floyd】

Arbitrage

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6465    Accepted Submission(s): 2985

Problem Description

Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent. 

Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.

 

 

Input

The input file will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear. The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency. Exchanges which do not appear in the table are impossible.
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n. 

 

 

Output

For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No". 

 

 

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个US货币在几次交换之后变成了1.05个货币。如果能够使得货币增加,输出yes,否则输出no。


思路:对于每种货币的交换值我们当做边权值。那么不难理解:如果i货币能够换到j货币,j货币能够换到k货币,那么i货币就能换到k货币,换得的值为:w【i】【j】*w【j】【k】。如果w【i】【k】没有直接交换的汇率,那么w【i】【k】的汇率就暂时赋值为w【i】【j】*w【j】【k】,如果w【i】【k】之间有汇率,那么:

w【i】【k】=max(w【i】【j】*w【j】【k】,w【i】【k】),整个dp的过程我们使用floyd算法来实现。毕竟n的范围才30,完全不用担心超时的问题。

而且我们这样来解决这个问题,最终得到的w【】【】,直接遍历询问w【i】【i】是否大于1即可。因为floyd可以解决有向环的问题啊!~~~~~~~··

AC代码:

#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<map>
using namespace std;
double w[60][60];
char tmp[1000],tmp2[1000];
double change;
int n;
double max(double a,double b)
{
    return a>b?a:b;
}
void init()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            w[i][j]=0x1f1f1f1f;
        }
    }
}
int main()
{
    int kase=0;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        init();
        int cont=1;
        map<string, int >mp;
        for(int i=0; i<n; i++)
        {
            scanf("%s",tmp);
            mp[tmp]=cont++;
        }
        int q;
        scanf("%d",&q);
        while(q--)
        {
            scanf("%s%lf%s",tmp,&change,tmp2);
            w[mp[tmp]][mp[tmp2]]=min(w[mp[tmp]][mp[tmp2]],change);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=n;k++)
                {
                    if(w[j][i]<0x1f1f1f1f&&w[i][k]<0x1f1f1f1f)
                    {
                        if(w[j][k]==0x1f1f1f1f)w[j][k]=w[j][i]*w[i][k];
                        else w[j][k]=max(w[j][i]*w[i][k],w[j][k]);
                    }
                }
            }
        }
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            if(w[i][i]>1)flag=1;
        }
        if(flag==1)
        {
            printf("Case %d: Yes\n",++kase);
        }
        else printf("Case %d: No\n",++kase);
    }
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值