肖申克的救赎 | ||||||
| ||||||
Description | ||||||
电影《肖申克的救赎》各位都应该非常的熟悉,当安迪杜弗瑞越狱后通过邮局将典狱长诺顿(如图)的黑账本邮寄到警察局。为了确保有足够的证据来逮捕诺顿,警察们需要仔细的对这个账本进行审查,找到诺顿洗钱的确凿证据。当然,钱的源头很难查明了,因为持有账户的人是杜弗瑞虚构出来的一个人物。但是在其它的过程中总是会出现一点蛛丝马迹的,比如诺顿喜欢用这些钱做一些交易,并且使自己最终得到更多的金钱(如果可能的话)。如果诺顿设法通过交易使自己的金钱获得增长,那么警察们就有机会找到诺顿违法的证据,就可以逮捕诺顿了。我们给出一些物品的换算比率,通过这些比率来判是否能找到诺顿违法的确凿证据。 | ||||||
Input | ||||||
本题有多组测试数据,一直处理到文件结束。对于每组数据,第一行输入两个整数m和n(n不超过100),分别表示最初金钱的数目(金钱用dollar代指)和兑换的组数。接下来n行输入方式如下: 物品1 物品2 兑换比率 表示一个物品1可以兑换多少个物品2,注意兑换比率应该是一个浮点数 | ||||||
Output | ||||||
如果警方掌握了确凿的证据,输出“YES”并换行(不包括引号),否则输出“NO”并换行(不包括引号) | ||||||
Sample Input | ||||||
100 3 dollar rmb 6.27 rmb gold 0.33 gold dollar 4.01 | ||||||
Sample Output | ||||||
YES
| ||||||
Hint | ||||||
要想能做到钱生钱,诺顿必须先有钱 | ||||||
Author | ||||||
杨和禹 |
思路:
直接按照汇率建边,将每种货币都看成一个点, 那么接下来求一个最长路,就能够得到最大的汇率,因为最终想要转化成dollar.所以那么对应求的就是一个最大换。
因为点数比较小,所以直接跑Floyd即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<map>
#include<iostream>
using namespace std;
double a[150][150];
char b[150];
char c[150];
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
memset(a,0,sizeof(a));
map<string,int >s;
s["dollar"]=1;
int cont=2;
for(int i=0; i<n; i++)
{
double w;
scanf("%s%s%lf",b,c,&w);
{
if(s[b]==0)
{
s[b]=cont++;
}
if(s[c]==0)
{
s[c]=cont++;
}
a[s[b]][s[c]]=w;
}
}
for(int i=0; i<cont; i++)
{
for(int j=0; j<cont; j++)
{
for(int k=0; k<cont; k++)
{
a[j][k]=max(a[j][k],a[j][i]*a[i][k]);
}
}
}
if(a[1][1]*m>m)
{
printf("YES\n");
}
else printf("NO\n");
}
}