自己看
2026-10-11 16:21:29
发布于:福建
0阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
struct Road {
double s, k, w;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
double EU;
cin >> n >> EU;
vector<Road> a(n);
for (auto &x : a) {
cin >> x.s >> x.k >> x.w;
}
// 求 k * v^2 * (v - w) = c 的解
auto getSpeed = [&](double c, double k, double w) {
double l = max(0.0, w);
double r = max(1.0, l + 1.0);
while (k * r * r * (r - w) < c) r *= 2.0;
for (int it = 0; it < 60; ++it) {
double mid = (l + r) * 0.5;
if (k * mid * mid * (mid - w) < c)
l = mid;
else
r = mid;
}
return (l + r) * 0.5;
};
auto totalEnergy = [&](double c) {
double sum = 0.0;
for (const auto &x : a) {
double v = getSpeed(c, x.k, x.w);
double d = v - x.w;
sum += x.k * x.s * d * d;
}
return sum;
};
// EU = 0 时,根据题目保证可行,所有路段均可借顺风前进
if (EU == 0.0) {
double ans = 0.0;
for (const auto &x : a) ans += x.s / x.w;
cout << fixed << setprecision(12) << ans << '\n';
return 0;
}
double l = 0.0, r = 1.0;
while (totalEnergy(r) < EU) r *= 2.0;
for (int it = 0; it < 70; ++it) {
double mid = (l + r) * 0.5;
if (totalEnergy(mid) < EU)
l = mid;
else
r = mid;
}
double c = (l + r) * 0.5;
double ans = 0.0;
for (const auto &x : a) {
double v = getSpeed(c, x.k, x.w);
ans += x.s / v;
}
cout << fixed << setprecision(8) << ans << '\n';
return 0;
}
这里空空如也







有帮助,赞一个