2163 Easy Trading
問題概要
k日間の株価が与えられる。
i日目におけるn日間の平均をPn(i),i日目におけるm日間の平均をPm(i)とする。
Pn(i)とPm(i)の大小が入れ替わった時点で株を購入することにする。
Pn(i)>Pm(i)のときは売り注文、そうでないときは買い注文をする。
また、n日目にも買い注文をする。
このとき、注文を全て出力せよ。
解法
定義にしたがって実装すればよい。
平均はいちいち計算するとTLEになるかもしれないので、更新する部分だけを足したり引いたりする。
ソースコード
int m,n,k; double p[10000],pm,pn,ppm,ppn; int main(){ scanf("%d%d%d",&m,&n,&k); rep(i,k)scanf("%lf",p+i); pn=pm=0; rep(i,n)pn+=p[i]; ppn=pn/n; rep(i,m)pm+=p[n-1-i]; ppm=pm/m; printf("%s ON DAY %d\n",ppn<ppm?"BUY":"SELL",n); for(int i=n;i<k;i++){ pn=ppn+(p[i]-p[i-n])/n; pm=ppm+(p[i]-p[i-m])/m; double an=0,am=0; rep(j,n)an+=p[i-j]/n; rep(j,m)am+=p[i-j]/m; if((pn-pm)*(ppn-ppm)<0)printf("%s ON DAY %d\n",pn<pm?"BUY":"SELL",i+1); ppn=pn; ppm=pm; } return 0; }