标签:
题目:
思路:
关键是对p0的选取,这里p0一定是有效的买单或卖单里的p。
理由:
若p0不是买单或卖单里的p,那么p0必然介于某两个出价p之间,设为 p1 和 p2,即 p1 < p0 < p2;
1.当买单和卖单里都有p2时,这时若以p0为单价,则必然会使卖单减少,由于成交量是取小的,所以成交量也会减小,就不如开盘价为p2是的好;
2.当只有买单有p2,和开盘价为p2时一样,所以开盘价不会是这个p0;
3.当只有卖单有p2,情况和 1 相同;
4.当买单和卖单里都有p1时或只有买单有p1时,若以p0为单价,则会使买单减少,继而成交量减小,不如开盘价为p1;
5.当只有卖单有p1时,这时和开盘价为p1时是一样的,此时p0优于p1,但是p2则必然优于p0;由于买单是没有p1,所以此时对于p1,p0,p2买单的成交量都一样,而 卖单的成交量p1和p0相同,p2则大于等于p1和p0;
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<set> 5 using namespace std; 6 typedef long long ll; 7 #define MAX 5007 8 typedef struct{ 9 string m; 10 double p; 11 int s; 12 bool e; 13 }R; 14 R r[MAX]; 15 set<double> st; 16 int main(){ 17 /* 18 这里的每一条记录都需要记录,包括cancel i, 19 因为cancel i 是在包含cancel i这条记录的情况的的第i条记录 20 */ 21 int m=0; 22 while(cin>>r[m].m){ 23 if(r[m].m == "cancel"){ 24 cin>>r[m].s; 25 r[r[m].s-1].e=true; 26 m++; 27 continue; 28 } 29 cin>>r[m].p>>r[m].s; 30 ++m; 31 } 32 for(int i=0;i<m;++i) 33 if(r[i].m != "cancel" && !r[i].e)st.insert(r[i].p); 34 35 ll m_sum=0; 36 double p=0; 37 for(set<double>::iterator it=st.begin();it!=st.end();++it){ 38 double p0 = *it; 39 ll sumb=0,sums=0,sum; 40 for(int i=0;i<m;++i) 41 if(r[i].m == "sell" && !r[i].e && r[i].p<=p0)sums+=r[i].s; 42 for(int i=0;i<m;++i) 43 if(r[i].m == "buy" && !r[i].e && r[i].p>=p0)sumb+=r[i].s; 44 sum=min(sums,sumb); 45 46 if(sum>=m_sum){ 47 m_sum=sum; 48 p=p0; 49 } 50 } 51 //注意保留到小数点后两位 52 printf("%.2f ",p); 53 cout<<m_sum<<endl; 54 return 0; 55 }
标签:
原文地址:http://www.cnblogs.com/ttzm/p/5884714.html