我们先来看一下题目
解题思路
看到题目感觉经济学知识,不会,仔细品一下,其实就是找个价钱让交易量最大,那么我们存好数据暴力就可以了。淦!
1.存数据我们用两个vector
2.暴力前,我们用两个sort()进行排序,这样遇到不满足的值可以break,不用遍历所有的数据
3.由于可能有多个交易最大值,为了取得最大价钱,我们用自己排序的set存储价钱(可以set不会有重复项),由经济学知识可以知道,最终的结果一定sell的price----这个不重要,全部压到set里就可以了
代码
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<vector>
#include<set>
#define ll long long
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node{
string str;
double price;
int num;
int index;
};
bool cmp1(node a,node b){
return a.price>b.price;
}
bool cmp2(node a,node b){
return a.price<b.price;
}
vector<node> buy,sell;
set<double> money;
const int maxn=5000;
int flag[maxn+1];
int main(){
int cnt=0;
node t;
mm(flag,0);
while(cin>>t.str){
cnt++;
if(t.str[0]=='c'){
int temp;
cin>>temp;
flag[temp]=1;
}else{
cin>>t.price>>t.num;
t.index=cnt;
if(t.str[0]=='b') buy.push_back(t);
else if(t.str[0]=='s') sell.push_back(t);
money.insert(t.price);
}
}
sort(buy.begin(),buy.end(),cmp1);
sort(sell.begin(),sell.end(),cmp2);
ll best_num=-1;
double best_price;
for(set<double>::iterator it=money.begin();it!=money.end();it++){
ll sell_num=0,buy_num=0;
for(int i=0;i<buy.size();i++){
if(flag[buy[i].index]) continue;
if(buy[i].price>=*it) buy_num+=buy[i].num;
else break;
}
for(int i=0;i<sell.size();i++){
if(flag[sell[i].index]) continue;
if(sell[i].price<=*it) sell_num+=sell[i].num;
else break;
}
if(buy_num>sell_num) buy_num=sell_num;
if(buy_num>=best_num){
best_num=buy_num;
best_price=*it;
}
}
cout<<fixed<<setprecision(2)<<best_price<<" "<<best_num<<endl;
return 0;
}