社区讨论
求问
P14174【MX-X23-T4】卡常数参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlj5av3a
- 此快照首次捕获于
- 2026/02/12 15:36 上周
- 此快照最后确认于
- 2026/02/14 22:00 5 天前
code:
CPP#include <bits/stdc++.h>
#define vt(x) vector <x>
#define it(x, n) x.begin() + 1, x.begin() + (n) + 1
#define int long long
#define len(x) (int)(x.size())
#define rep(i, s, t) for (int i = (s); i <= (t); i += 1)
#define func(type, para...) function <type(para)>
using namespace std;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
struct Num{
int a, b;
double r;
};
vt(vt(Num)) a(n + 1);
vt(int) x(n + 1);
rep(i, 1, n) {
int l;
cin >> x[i] >> l;
a[i].assign(l + 1, Num());
rep(j, 1, l)
cin >> a[i][j].a;
rep(j, 1, l)
cin >> a[i][j].b;
rep(j, 1, l)
a[i][j].r = (double)a[i][j].b / a[i][j].a;
sort(it(a[i], l), [&](Num x, Num y) {
return x.r < y.r;
});
}
vt(int) P = x;
rep(i, 1, n)
rep(j, 1, len(a[i]) - 1)
P[i] *= a[i][j].a;
struct Choice{
int id, power;
bool operator< (const Choice& y) const {
return power < y.power;
}
};
priority_queue <Choice> pq;
rep(i, 1, n)
pq.push({i, P[i] / a[i].back().a * a[i].back().b});
while (k --) {
int i = pq.top().id, power = pq.top().power;
pq.pop();
a[i].pop_back();
P[i] -= power;
if (!a[i].empty()) //hachimi
pq.push({i, P[i] / a[i].back().a * a[i].back().b});
}
int ans = 0;
rep(i, 1, n)
ans += P[i];
cout << ans << "\n";
return 0;
}
code:
CPP#include <bits/stdc++.h>
#define vt(x) vector <x>
#define it(x, n) x.begin() + 1, x.begin() + (n) + 1
#define int long long
#define len(x) (int)(x.size())
#define rep(i, s, t) for (int i = (s); i <= (t); i += 1)
#define func(type, para...) function <type(para)>
using namespace std;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
struct Num{
int a, b;
double r;
};
vt(vt(Num)) a(n + 1);
vt(int) x(n + 1);
rep(i, 1, n) {
int l;
cin >> x[i] >> l;
a[i].assign(l + 1, Num());
rep(j, 1, l)
cin >> a[i][j].a;
rep(j, 1, l)
cin >> a[i][j].b;
rep(j, 1, l)
a[i][j].r = (double)a[i][j].b / a[i][j].a;
sort(it(a[i], l), [&](Num x, Num y) {
return x.r < y.r;
});
}
vt(int) P = x;
rep(i, 1, n)
rep(j, 1, len(a[i]) - 1)
P[i] *= a[i][j].a;
struct Choice{
int id, power;
bool operator< (const Choice& y) const {
return power < y.power;
}
};
priority_queue <Choice> pq;
rep(i, 1, n)
pq.push({i, P[i] / a[i].back().a * a[i].back().b});
while (k --) {
int i = pq.top().id, power = pq.top().power;
pq.pop();
a[i].pop_back();
P[i] -= power;
if (!a[i].empty() && a[i].back().a != 0) //hachimi
pq.push({i, P[i] / a[i].back().a * a[i].back().b});
}
int ans = 0;
rep(i, 1, n)
ans += P[i];
cout << ans << "\n";
return 0;
}
注意到,两段代码仅在第 行不同(有注释
hachimi 的那一行),为什么仅加一个 a[i].back().a != 0 就能过? a[i].back().a != 0 应当恒为 true 的。求问为什么会有这样的情况
回复
共 0 条回复,欢迎继续交流。
正在加载回复...