题目描述
给定2支股票的开盘价和收盘价的N天历史数据,
要求按开盘和收盘,分别计算每支股票的每个日期对应的M天移动平均价格。
假定两个股票数据如下:
日期 开盘/收盘 第1支股票价格S1 第2支股票价格S2
2004/7/29 close 6 4
2004/7/25 close 2 6
2004/7/26 open 8 12
2004/7/30 open 2 4
2004/7/27 close 8 10
2004/7/28 open 4 2
按M=2天计算移动平均价格,按先开盘,后收盘价,输出如下:(若某日期之前,没有M-1条的记录(日期不用连续),则不用输出)
2004/7/28 open 6 7
2004/7/30 open 3 3
2004/7/27 close 5 8
2004/7/29 close 7 7
其中, 2004/7/28日的S1的值为(8+4)/2 = 6, 即将2004/7/28和(最近1条记录2004/7/26,最近2条记录,最近M-1条记录)的价格,求和并计算平均。
输入
第1行:N天记录 M天平均
第2行到N+1行:N天2支股票的开盘与收盘价格(注意日期是无序的)
6 2
2004/7/29 close 6 4
2004/7/25 close 2 6
2004/7/26 open 8 12
2004/7/30 open 2 4
2004/7/27 close 8 10
2004/7/28 open 4 2
输出
每个日期的最近M条记录(包括该日期的价格在内)的平均价格(若某日期之前没有M-1条的记录(日期不用连续),则不用输出)
2004/7/28 open 6 7
2004/7/30 open 3 3
2004/7/27 close 5 8
2004/7/29 close 7 7
样例输入
6 2
2004/7/29 close 6 4
2004/7/25 close 2 6
2004/7/26 open 8 12
2004/7/30 open 2 4
2004/7/27 close 8 10
2004/7/28 open 4 2
样例输出
2004/7/28 open 6 7
2004/7/30 open 3 3
2004/7/27 close 5 8
2004/7/29 close 7 7
代码
#include "iostream"
#include "cstdio"
#include "algorithm"
#include "string"
using namespace std;
struct stock{
int y,m,d,s1,s2;
};
bool cmp(stock a,stock b){
if(a.y==b.y){
if(a.m==b.m){
return a.d<b.d;
}
return a.m<b.m;
}
return a.y<b.y;
}
class stocklist{
private:
stock *openlist;
stock *closelist;
int sum1,sum2;
public:
stocklist(){
sum1=sum2=0;
int N,M;
cin>>N>>M;
openlist=new stock[N+1];
closelist=new stock[N+1];
for(int i=1;i<=N;i++){
int y, m, d, s1, s2;
string op;
scanf("%d/%d/%d", &y, &m, &d);
cin >> op;
cin >> s1 >> s2;
// cout << y << " " << m << " " << d << " " << op << " " << s1 << " " << s2 << endl;
if(op=="open"){
sum1++;
openlist[sum1]=(stock){y,m,d,s1,s2};
}
else{
sum2++;
closelist[sum2]=(stock){y,m,d,s1,s2};
}
}
sort(openlist+1,openlist+sum1+1,cmp);
sort(closelist+1,closelist+sum2+1,cmp);
for(int i=M;i<=sum1;i++){
int ans1=0,ans2=0;
for(int j=i,k=0;k<M;k++){
ans1+=openlist[j-k].s1;
ans2+=openlist[j-k].s2;
}
ans1/=M;
ans2/=M;
printf("%d/%d/%d open %d %d\n",openlist[i].y,openlist[i].m,openlist[i].d,ans1,ans2);
}
for(int i=M;i<=sum2;i++){
int ans1=0,ans2=0;
for(int j=i,k=0;k<M;k++){
ans1+=closelist[j-k].s1;
ans2+=closelist[j-k].s2;
}
ans1/=M;
ans2/=M;
printf("%d/%d/%d close %d %d\n",closelist[i].y,closelist[i].m,closelist[i].d,ans1,ans2);
}
}
~stocklist(){
delete []openlist;
delete []closelist;
}
};
int main(){
// freopen("123.in","r",stdin);
stocklist list;
return 0;
}