二分答案
#include <iostream> #include <queue> #include <map> #include <set> #include <cmath> #include <cstring> #include <algorithm> #include <iomanip> #include <stack> #include <numeric> #include <ctime> #include <string> #include <bitset> #include <unordered_map> #include <unordered_set> using namespace std; using ll = long long; const ll N = 1e5+5,mod=1e9+7,inf=0x3f3f3f3f; const double esp=1e-6; ll n, k; struct Node{ ll x, y, v; double R; bool operator<(const Node& u) const { return R < u.R; } } a[N]; double summ[N]; bool check(double mid) { int len = upper_bound(a + 1, a + n + 1, Node{0, 0, 0, mid}) - a; return summ[len - 1] >= k; } void solve() { cin >> n >> k; ll sum = 0; for (int i = 1; i <= n; i++) { cin >> a[i].x >> a[i].y >> a[i].v; a[i].R = sqrt(a[i].x * a[i].x + a[i].y * a[i].y); sum += a[i].v; } if (sum < k) { cout << -1; return; } sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) { summ[i] = summ[i - 1] + a[i].v; } double l = 0, r = 2e9; while (fabs(r - l) > esp) { double mid = (r + l) / 2; if (check(mid)) { r = mid; } else { l = mid; } } cout << fixed << setprecision(10) << l; } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t = 1; //cin >> t; while (t--) { solve(); } return 0; }