您的位置:首页 > 其它

CCF 集合竞价

2015-08-26 21:32 363 查看
以下是我做题的经验,如有错误,请谅解并指正

(s代表卖家,b代表买家)

1.最好不要以s的价格来选取开盘价p0;题目中已说明:如果有多个符合条件的开盘价,你的程序应当输出最高的那一个。b价格应比s的高

以s的价格来选取p0的代码(提交后错误):

代码一:

#include <iostream>

#include <math.h>

#include<algorithm>

#include<iostream>

#include<cstring>

#include <cstdio>

#include <string.h>

#include <stdio.h>

using namespace std;

struct pp{

    string ss;

    double pr;

    long long am;

};

int i,j,n;

int a[5001]={0};

pp p[5001],s[5001],b[5001];

int is=0,ib=0;

double mpr=0,repr=0;

long long mam=0,ream=0;

long long alls=0.00,allb=0.00;

int main(){

    n=1;

    freopen("in.txt","r",stdin);

    while(cin>>p
.ss){

        if(p
.ss!="cancel"){

            cin>>p
.pr>>p
.am;

            n++;

            a[i]=0;

        }

        else {

            int del;

            cin>>del;

            a[del]=1;

            n++;

        }

    }

    for(i=1;i<n;i++){

        if(a[i]==0){

            if(p[i].ss=="buy"){

                b[ib].ss="buy";

                b[ib].am=p[i].am;

                b[ib].pr=p[i].pr;

                ib++;

            }

            else if(p[i].ss=="sell"){

                s[is].ss="sell";

                s[is].am=p[i].am;

                s[is].pr=p[i].pr;

                is++;

            }

        }

    }

   for(i=0;i<is;i++){

        for(j=i+1;j<is;j++){

            if(s[i].pr>s[j].pr){

                swap(s[i].pr,s[j].pr);

                swap(s[i].am,s[j].am);

            }

        }

    }

    for(i=0;i<ib;i++){

        for(j=i+1;j<ib;j++){

            if(b[i].pr>b[j].pr){

                swap(b[i].pr,b[j].pr);

                swap(b[i].am,b[j].am);

            }

        }

    }

    for(i=0;i<is;i++){

            allb=0.0;

            alls+=s[i].am;

            mpr=s[i].pr;

        for(j=0;j<ib;j++){

             if(b[j].pr>=mpr){

                 allb+=b[j].am;

            }

        }

        mam=min(alls,allb);

        if(mam>ream){

            repr=mpr;

            ream=mam;

        }

    }

    printf("%.2lf %lld\n",repr,ream);

    return 0;

}

以下为正确代码:

代码二

#include <iostream>

#include <math.h>

#include<algorithm>

#include<iostream>

#include<cstring>

#include <cstdio>

#include <string.h>

#include <stdio.h>

using namespace std;

struct pp{

    string ss;

    double pr;

    long long am;

};

int i,j,n;

int a[5001]={0};

pp p[5001],s[5001],b[5001];

int is=0,ib=0;

double mpr=0,repr=0;

long long mam=0,ream=0;

long long alls=0.00,allb=0.00;

int main(){

    n=1;

    while(cin>>p
.ss){

        if(p
.ss!="cancel"){

            cin>>p
.pr>>p
.am;

            n++;

            a[i]=0;

        }

        else {

            int del;

            cin>>del;

            a[del]=1;

            n++;

        }

    }

    for(i=1;i<n;i++){

        if(a[i]==0){

            if(p[i].ss=="buy"){

                b[ib].ss="buy";

                b[ib].am=p[i].am;

                b[ib].pr=p[i].pr;

                ib++;

            }

            else if(p[i].ss=="sell"){

                s[is].ss="sell";

                s[is].am=p[i].am;

                s[is].pr=p[i].pr;

                is++;

            }

        }

    }

    for(i=0;i<is;i++){

        for(j=i+1;j<is;j++){

            if(s[i].pr>s[j].pr){

                swap(s[i].pr,s[j].pr);

                swap(s[i].am,s[j].am);

            }

        }

    }

    for(i=0;i<ib;i++){

        for(j=i+1;j<ib;j++){

            if(b[i].pr>b[j].pr){

                swap(b[i].pr,b[j].pr);

                swap(b[i].am,b[j].am);

            }

        }

    }

    for(i=ib-1;i>=0;i--){

            allb+=b[i].am;

            mpr=b[i].pr;

            alls=0.00;

        for(j=0;j<is;j++){

            if(s[j].pr>mpr){

                break;

            }

            alls+=s[j].am;

        }

        mam=min(alls,allb);

        if(mam>ream){

            ream=mam;

            repr=mpr;

        }

    }

    printf("%.2lf %lld\n",repr,ream);

    return 0;

}

一下测试数据 就可得错误的原因:

sell  8.92 400

sell 9.0 1000

buy 8.88 175

buy 8.95 400

buy 100.0 50

代码一的结果为8.92 400;

代码二的结果为8.95 400;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CCF