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