外貨両替(最短)

DescriptionSeveral為替ポイントは、私たちの街で働いています。私たちは、各ポイントは2つの特定の通貨を専門と実行するだけでこれらの通貨での操作を交換することを想定してみましょう。通貨の同じペアに特化したいくつかのポイントが存在する場合があります。各点はBにAの為替レートは、あなたが1Aのために取得するBの量であり、独自の為替レートを持っています。また、各交換ポイントはいくつかの手数料、あなたの交換作業のために支払わなければならない合計を持っています。委員会は、常にソース通貨で収集されます。
たとえば、あなたが交換ポイントにロシア・ルーブルに100ドルを交換したい場合は、どこ為替レートは29.75で、手数料は0.39であるあなたは、(100から0.39)を取得します* = 2963.3975RUR 29.75。
あなたは確かにあなたが私たちの街に対処することができ、N個の異なる通貨があることを知っています。私たちは1からNまでの各通貨に一意の整数番号を割り当ててみましょう。為替レートおよび手数料をそれぞれAとB、BにAを交換する-それ通貨交換、及び実際のRAB、CAB、RBAおよびCBAの数- A整数およびB:各交換点は6つの数字で記述することができます。
彼は何とか、いくつかの交換作業の後、彼の資本を増やすことができれば、ニックは、通貨Sと不思議にいくつかのお金を持っています。もちろん、彼は最終的に通貨Sに彼のお金を持って望んでいます。この困難な質問に答えるために彼を助けます。彼の操作をしながらニックは常にお金の非負の和を持っている必要があります。
-通貨の数、M -交換ポイント数、S -通貨ニックの数があり、V - 、彼が持っている通貨単位の量N:入力のInputThe最初の行は、4つの数字を含んでいます。対応する交換点の説明- -順上で指定の次のMラインが6つの番号をそれぞれ含みます。数値は、1つ以上のスペースで区切られます。1 <= S <= N <= 100、1 <= M <= 100、Vは実数、0 <= V <= 1000です。
為替レートと手数料が実数である各点について、小数点、0.01 <=率<= 100、0 <=手数料<= 100の後に最大で2桁の数字で与えられました。
何の交換ポイントがよりこの順序で何度も使用されていない場合、私たちは為替操作の簡単ないくつかのシーケンスを呼ぶことにしましょう。あなたが最後に合計の数値の比をとることができるし、為替業務のいずれかの簡単なシーケンスの始め未満10000になります
OutputIfニックに他のケースの出力NOで、出力YESを彼の富を増やすことができます出力ファイル。
サンプル入力
3 2 1 20.0
1 2 1.00 1.00 1.00 1.00
2 1.10 3 1.00 1.10 1.00
サンプル出力
YES

質問の意味:都市は為替のポイントをたくさん持っている、それぞれの交換ポイントは、このようなR Bコンバーチブル為替レートと異なる通貨、と交換することができ、手数料cが存在し、そしてVはBに貴重な通貨であります単独のお金(AC)* R。今n型、M、S、V、N表現通貨、M交換ポイント、通貨の開始は、値V Sの番号が付けられています。入力各交換、B、ラブ、キャブ、 RBA、CBA、 交換ポイントBとB償還手数料や為替レートの償還を持ちます。
この質問は、右ループ回路があるかどうかを尋ねるためにあなたを求めています。

#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std;
int n,m,x,flag,u[220],v[220];
double y,dis[220],r1[220],c1[220],r2[220],c2[220];
void ss()
{
	for(int i=1;i<n;i++)
	{
		int count=0;
		for(int j=1;j<=m;j++)
		{
			if(dis[v[j]]<(dis[u[j]]-c1[j])*r1[j])
			{
				dis[v[j]]=(dis[u[j]]-c1[j])*r1[j];
				count++;
			}
			if(dis[u[j]]<(dis[v[j]]-c2[j])*r2[j])
			{
				dis[u[j]]=(dis[v[j]]-c2[j])*r2[j];
				count++;
			}
		}
		if(count==0)
		break;
	}
	flag=0;
	for(int j=1;j<=m;j++)
	{
		if(dis[v[j]]<(dis[u[j]]-c1[j])*r1[j])
		{
			flag=1;
			break;
		}
		if(dis[u[j]]<(dis[v[j]]-c2[j])*r2[j])
		{
			flag=1;
			break;
		}
	}
}
int main()
{
	while(~scanf("%d%d%d%lf",&n,&m,&x,&y))
	{
		memset(dis,0,sizeof(dis));
		dis[x]=y;
		for(int i=1;i<=m;i++)
		scanf("%d%d%lf%lf%lf%lf",&u[i],&v[i],&r1[i],&c1[i],&r2[i],&c2[i]);
		ss();
		if(flag==1)
		printf("YES\n");
		else
		printf("NO\n"); 
	}
}
公開された12元の記事 ウォンの賞賛1 ビュー200

おすすめ

転載: blog.csdn.net/csx_zzh/article/details/104298516