トピック説明:二から一一後、SYXは、彼らが土を食べることを約あることがわかりました。しかし、彼はウィットの資金を調達することを決めました。彼がダウン、上下そこに見つけ、市場ビットコインの将来のn日を予測しました。彼のお金は限りビットコインの浮き沈みの波の経験、低所得は、高く売るとして、あなたは簡単に金持ちにするために、他の人にネギをカットすることができます。彼はだけでなく、より多くのビットコイン1以上を保持するために彼の手をまで決定したときに、リスクを軽減し、彼は可能な限り最も収益性の高い状況で発生したトランザクションの数を減らすために望んでいたします。Nビットは、現在の日の通貨市場、日あたりのコインの、すなわち、ビット値が与えられます。どのくらいの利益を最大SYX n日を、見つけてください!最大の利益の場合、トランザクションの最小数は何倍ですか?私たちは、彼が波を作るためにお金を借りたい場合でものでSYXは、最初に無制限のお金を持っていると仮定します。
入力:最初の行は、整数tを有し、Tは、全データセットを表します。0 <T <= 5 2本のデータ線の各々の群:
1行目の各データは、予測された市場の日が整数nであり、nは(1 <= N <= 100000)
データの各セットの第2行について、nは整数であり、Iはそれぞれ、i番目の日の市場を表します。(0 <A = I <= 10 10)
輸出
トランザクションの最大の利益と最小数を表すサンプルの各セット、スペースで区切られた2つの整数の出力ラインのために
サンプル入力
2
5
9 10 6 7 8
3
3 2 1
サンプル出力
4 3
0 0
コード
する#include <stdio.hに>
(INTメイン){
int型T;
長いロングB、C [6] [6];
scanfの( "%のD"、&T);
(INT J = 0; J <T; J ++){
int型N-、I = 0、X = 0、S = 0、金= 0;
ロングロングA [100005];
scanfの( "%のD"、およびN-);データの// Nセット
(iについて= 1; <= N-I; Iは++){
scanfの( "%のD"、および[I]); // N日間の市場
}
。(I = 1、I <N - 、Iは++){
IF([I + 1]> A [I]){
。マネーマネー+ =([I + 1] -a [I]);
S ++; //カウント差
}他{
S = 0; //変数sを基準として導入される、のいずれか何回連続トランザクション、最小数をカウントするために、最終的な数は2である
} //後者が小さい場合、すなわち、損失が発生し、クリアsの
場合(S == 1)、X = X + 2。
}
B [j]はお金を=。
C [J] = Xであり;
}
ため(INT I = 0;私はTを<; Iは++){
のprintf( "%D%D \ N-"、B [I]、C [I]);
}
戻り0;
}
最も私は、あなたが正確にトランザクションの最小数を計算することはできません、変数sの導入を期待していませんでした。隣接する最高点を見つけ、最低点に最初に行く、その後、違いを確認した後、上記を繰り返しますが、これは時間の最小の数をカウントしない最善の利益。
限り、後者は表示された場合は、回数プラス2、1とした後、1 +、変数sの導入後、単に後者が大きいか否かを判定し、大規模な場合には、違いが利益のために数え、++ sは、最初は0よ前者よりも小さく、そして継続的な取引は次の連続取引のために準備するために、今回の明確な、中断されました。