题解:P12712 [KOI 2021 Round 1] 超矩形
ElectricArc · · 题解
题意
变量
有
选用恰好
思路
我们考虑贪心,每次都拿一张目前能使总体积增大最多的卡牌,一直贪下去即可。
现在考虑如何找到目前最优的卡牌。
- 同个变量(字母)的卡牌按大小降序排序。
- 取每个变量中卡牌最大的那一张,设为
d_i \ (i \in \{A,B,C,D\}) ,分别计算使用后增大的体积,取贡献最大的那一张卡牌用掉。
设目前变量的值为
例如,比较变量
但是,我们在算增大的体积时,这些值相乘后直接爆 long long 了。不过很容易发现两边可以同时除以
考虑比较增加变量
代码
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;
priority_queue<int> q[4];
ll s[4];
int main() {
int n, k;
scanf("%d %d", &n, &k);
for (int i = 0; i < 4; i++) scanf("%lld", &s[i]);
for (int i = 1; i <= n; i++) {
char t;
int u;
scanf(" %c %d", &t, &u);
q[t - 'A'].push(u);
}
for (int i = 0; i < 4; i++) q[i].push(0); // 防止队首取空
for (int i = 1; i <= k; i++) {
int pre[4];
for (int j = 0; j < 4; j++) pre[j] = q[j].top();
int pos = -1;
long double mx = 0;
for (int j = 0; j < 4; j++) {
long double tmp = pre[j] / (long double)s[j];
if (mx < tmp) mx = tmp, pos = j;
}
s[pos] += pre[pos];
q[pos].pop();
printf("%c %d\n", pos + 'A', pre[pos]);
}
return 0;
}