トップページに戻る
次の競技プログラミングの問題へ
AOJ本-998 MaximumProfit
■■■問題■■■
FX取引では、異なる国の通貨を交換することで
為替差の利益を得ることができます。
例えば、1ドル100円の時に1000ドル買い、
価格変動により1ドル108円になった時に売ると、
(108円-100円)*1000ドル = 8000円の利益を得ることができます。
ある通貨について、時刻tにおける価格Rt (t=0,1,2 ・・・ ,n-1)が入力として与えられるので、
価格の差RJ-RI (ただし、J > I とする)の最大値を求めてください。
■■■入力■■■
最初の行に整数nが与えられます。続くn行に整数Rt (t=0,1,2 ・・・ ,n-1)
が順番に与えられます。
■■■出力■■■
最大値を1行に出力してください。
■■■制約■■■
2 <= n <= 20万
1 <= Rt <= 10の9乗
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("6");
WillReturn.Add("5");
WillReturn.Add("3");
WillReturn.Add("1");
WillReturn.Add("3");
WillReturn.Add("4");
WillReturn.Add("3");
//3
//価格が1のとき買って
//4のときに売ると4-1=3で最大3の利益を得ることができます。
//最初の5を使うと5-1=4となりますが、
//これは5の方が時間が前なので許されません。
}
else if (InputPattern == "Input2") {
WillReturn.Add("3");
WillReturn.Add("4");
WillReturn.Add("3");
WillReturn.Add("2");
//-1
//価格が減少しているケースですが、
//この問題ではJ > I という条件から、
//買って売る作業を1回は行う必要があるので、
//最大利益は-1となります。
}
else if (InputPattern == "Input3") { //最悪計算量
WillReturn.AddRange(Enumerable.Repeat("100000000", 200000));
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] R = InputList.Skip(1).Select(X => int.Parse(X)).ToArray();
int MinValue = R[0]; //最小価格
int MaxProfit = int.MinValue; //最大利益
for (int I = 1; I <= R.GetUpperBound(0); I++) {
int CurrProfit = R[I] - MinValue;
//最大利益の更新
if (MaxProfit < CurrProfit)
MaxProfit = CurrProfit;
//最小価格の更新
if (MinValue > R[I])
MinValue = R[I];
}
Console.WriteLine("最大利益は{0}", MaxProfit);
}
}
実行結果
最大の利益は3
解説
現在の添字の1つ前までの、最大の価格を、
変数に保持した状態で、For文を実行してます。