説明
いくつかの通貨の為替ポイントは、私たちの街で働いています。私たちは、各ポイントは2つの特定の通貨を専門とだけこれらの通貨との為替操作を実行すると仮定しましょう。通貨の同じペアに特化したいくつかのポイントが存在する場合があります。各点はBへの為替レートは、あなたが1Aのために取得するBの量であり、独自の為替レートを持っています。また、各交換ポイントはいくつかの手数料、あなたの交換作業のために支払わなければならない合計を持っています。委員会は、常にソース通貨で収集されます。
たとえば、為替レートは29.75で、手数料は0.39であるあなたは(100から0.39)を取得します交換時点で、ロシアルーブルに100ドルを交換したい場合は* 29.75 = 2963.3975RURを。
あなたは確かにあなたが私たちの街に対処することができますN異なる通貨があることを知っています。私たちは1からNまでの各通貨に一意の整数番号を割り当ててみましょう。-通貨それ交換、及び実際のRの数字整数AとB:各交換点は6つの数字で記述することができるAB、C AB、R BA およびC BA 為替レート及び手数料にそれぞれB及びBに交換します- 。
ニックは通貨Sでいくつかのお金を持っており、彼は何とか、いくつかの交換作業の後、彼の資本を増やすことができるかどうか不思議。もちろん、彼は最終的に通貨Sに自分のお金を持って望んでいます。この困難な質問に答えるために彼を助けます。彼の操作をしながらニックは常にお金の非負の和を持っている必要があります。
入力
小数点以下せいぜい2桁の所与為替レートおよび手数料が実数である各点について、10 -2 <=レート<= 10 2 、0 <=手数料<= 10 2 。
何の交換ポイントが、この順序で複数回使用されていない場合、私たちは、単純な為替操作のいくつかのシーケンスを呼ぶことにしましょう。あなたは、最後に合計の数値の比をとることができるし、為替業務のいずれかの簡単なシーケンスの始めに10未満となります 4 。
出力
サンプル入力
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
サンプル出力
はい
質問の意味:
多分お金を変更、切り換え点は1〜N、各点は、相互に対応するお金に変換することができるされている - (主電荷)= *空マネー変換後に得られます。
あなたは彼がお金の増加にお願いをさせることはできません。
アイデア:
自閉症、および英語でとても難しいため、長い時間を探して読むことができません。。。。。N、M、S、V:N切り替えポイントを表す、2つのモード間m個のスイッチ、Sは初期通貨(すなわち、ソース)であり、VはA、B、R、行ごとに、クラスSマネーの数が有していますAB、C AB、 R&LTのBA、 CのBAは 交換電荷に、B二つの通貨、B及び交換費用に、Bです。ポジ(お金を稼ぐことがあるため)が存在するか否かを判断することができるベルマン-フォードリングと、問題は、他のソース点への最短パスを見つけることである参照。
コード:
#include <地図> の#include <cmath> の#include <キュー> の#include <スタック> の#include <限界> の#include <cstdioを> する#include < ストリング > の#include <CStringの> する#include <cstdlib> の#include <入出力ストリーム> #include <アルゴリズム> の#defineサイエンス(X)のscanf( "%dの"、およびX) の#define SCI2(X、Y)のscanf( "%dの%のD"、およびX&Y) の#define SCI3(X、Y、Z )のscanf( "%D%D%D"、およびX&Y、およびZ) #defineする SCL(X)のscanf( "%I64dを"、& X) の#define SCL2(X、Y)のscanf( "%I64d%I64d"、およびX&Y) の#defineSCL3(X、Y、Z)のscanf( "%I64d%I64d%I64d"、およびX&Y、およびZ) #defineするぷり(X)のprintf( "%Dを\ n"、X) の#define PRL(X)のprintf( "%I64dの\ n"、X) の#define(I、X、Yについては)ための式(I = xをint型、I yを<; I ++) の#define FFor(I、x、y)がため(I = xをint型、私は> Y; i--) の#define For_(I、x、y)は(I = xをint型のために、私は= yと<; Iは++) の#define FFor_(I、x、y)は(I = xをint型のために、I> = Y; i--) の#define MEM(F、X)のmemset(F、X、はsizeof(F)) の#define LL長い長 の#define ULL符号なし長い長 の#define MAXSIZE 255 の#define INF 0x3f3f3f3f CONST INT MOD = 1E9 + 7 ; constの ダブル= ACOSは、PI( - 1.0 ); 使用し た名前空間STD; 構造体ノード { int型S; int型E; ダブルR&LT; ダブルC; }エッジ[MAXSIZE]; ダブル DIS [MAXSIZE]; // DIS [I]が表される場合通貨私はお金の数である 整数; N-、M、S ダブル ; V // ベル型、スイッチングポイントどのくらい、 ボイドベルマン(INT K) { MEM(DIS、0); // この場所に起因して、0に初期化されます正リングするかどうかを決定 DIS [S] = V; // ソースすなわち彼距離Vのお金は、最初有する ため(Iを、1。、N-) について(J、1 、K) { ノードデータ = エッジ[J]; IF(DIS [data.e] <(DIS [data.s] -data.c)* data.r)// ここで数よりも少ないと、金額は緩和が検索を行うには 、[data.e] =(DISは[data.s] -data.c)* DIS ; data.r } について(I、1 、K) { ノードデータ = [エッジI]; IF(DIS [data.e] <(DIS [data.s] -data.c)* data.r)// 正環例示 { のprintf(" YES \ N- " ); を返す; } } のprintf (" NO \ nをしません" ); } int型のmain() { // int型のX、Y、Z。 // もし(DIS [エッジ[I] .E <DIS [エッジ[]]) // のscanf( "%D%D%D%D") SCI3(N、M、S)。 scanf関数(" %のLF "、&V); int型S、E。 int型のk = 1 。 一方、(M-- ) { SCI2(S、E)。 エッジ[k]は.S =のSと、 エッジ[K] .E = E。 scanf関数(" %のLFの%のLF "、&エッジ[K] .R&エッジ[K] .C)。 K ++ ; エッジ[k]は.S = E。 エッジ[K] .E = S。 scanf関数(" %のLFの%のLF "、&エッジ[K] .R&エッジ[K] .C)。 K ++ ; } ベルマン(K)。 リターン 0 ; }