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;
}