HDU 1217 Arbitrage

问题描述:

假设一美元可以换0.5英镑,一英镑可以换10.0法币,一法币可以换0.21美元,一个聪明的商人会发现用一美元最终可以换取1.05美元,有5%的利息呢

输入:

输入包括一个或多个案例,每个案例的第一行是一个整数n(1<=n<=30),代表不同利息的数目。下边n行包括每个利息的名字。下边包含一个整数m,代表要遵循的表。最后m行中,每一行包含原汇率名ci,一个值rij代表从ci到目的汇率名cj的值。

测试集通过一个空行分割开,n值为0时结束输入。

输出:

每一个案例,都按照要求的格式”Case case:Yes/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
思路:这道题目,我最终发现自己出错的原因是题意没搞清除。因为最后判断YEsor No的标准是存不存在一种货币是可以获利的,我最初以为只考虑美元呢~
这道题目其实还是最短路径的题目,只不过最终是求最大值的问题。把加编成乘就好了。最后也很关键,要判断每一个graph[i][i]是否会大于1,只要存在就YEs了,否则No


import java.util.*;
public class Main1217 {
	public static void main(String[] args){
		Scanner cin=new Scanner(System.in);
		
	        int count=1;
		while(cin.hasNext()){
		int num=cin.nextInt();
		if(num==0)break;
		ArrayList<String> al=new ArrayList<String>();
		double[][] graph=new double[30][30];
	
		for(int i=0;i<num;i++){
			al.add(cin.next());
		}
		for(int i=0;i<num;i++)
			for(int j=0;j<num;j++)
				if(i==j)graph[i][j]=1;
				else graph[i][j]=0;
		
		int tableNum=cin.nextInt();
		for(int i=0;i<tableNum;i++){
			String sta=cin.next();
			double value=cin.nextDouble();
			String en=cin.next();
			if(graph[al.indexOf(sta)][al.indexOf(en)]<value)
			graph[al.indexOf(sta)][al.indexOf(en)]=value;
		}
		
	
		
		for(int k=0;k<num;k++)
			for(int i=0;i<num;i++)
				for(int j=0;j<num;j++)
					if(graph[i][k]*graph[k][j]>graph[i][j]){
						graph[i][j]=graph[i][k]*graph[k][j];
						
					}
		
		int i=0;
		for(i=0;i<num;i++)
			if(graph[i][i]>1){
			System.out.println("Case "+(count++)+":"+" Yes");
			break;
		}
		if(i>=num)System.out.println("Case "+(count++)+":"+" No");
		
		
	}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值