计算2支股票的M天运动平均价格

题目描述

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值