201412-3 集合竞价
贪心
本体题意表述不明,实际不会出现cancel型撤销cancel型的情况,被撤销的记录一定是前两种类型。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 5010;
int n, p0;
struct Record {
int type; // 1: buy, 2: sell
double p;
int s;
bool is_cancelled;
} record[N];
int main() {
char type[8];
while (~scanf("%s", type)) {
if (type[0] == 'b') {
double p;
int s;
scanf("%lf%d", &p, &s);
record[++n] = {1, p, s};
} else if (type[0] == 's') {
double p;
int s;
scanf("%lf%d", &p, &s);
record[++n] = {2, p, s};
} else {
int id;
scanf("%d", &id);
record[id].is_cancelled = true;
record[++n].is_cancelled = true; // cancellers cancelled
}
}
double res_p;
LL res_s = 0;
for (int i = 1; i <= n; i++)
if (!record[i].is_cancelled) {
double p0 = record[i].p; // p0必然为输入的价格
LL s_buy = 0, s_sell = 0;
for (int j = 1; j <= n; j++)
if (!record[j].is_cancelled) {
if (record[j].type == 1 && record[j].p >= p0) s_buy += record[j].s;
else if (record[j].type == 2 && record[j].p <= p0) s_sell += record[j].s;
}
LL t = min(s_buy, s_sell);
if (t > res_s || (t == res_s && p0 > res_p)) {
res_p = p0;
res_s = t;
}
}
printf("%.2lf %lld\n", res_p, res_s);
return 0;
}