把符合条件的园找出来,然后根据需要移动的位置大小排序,需要注意最小移动大小的计算方式,然后根据要移走的园的数量依次移除即可

#include <bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
#define all(a) a.begin(), a.end()
#define vi vector<int>
#define vii vector<vector<int>>
#define fi first 
#define se second
struct yuan
{
    int x , y , r ; 
    double to ; 
};
double check(int x , int y , int r)
{
    double h = sqrt(x * x + y * y);
    return h ; 
}
bool cmp(yuan & a , yuan & b)
{
    return a.to < b.to ;
}
void work() 
{
    int n , k ; cin >> n >> k ; 
    vector<yuan>arr;
    for(int i = 0 ; i < n ; i++)
    {
        int x , y , r ; cin >> x >> y >> r ;
        double ju = check(x , y , r);
        if(ju <= r)
        {
            double ao = abs(r - ju) * acos(-1.0) * r * r ; 
            arr.push_back({x ,y , r , ao});
        } 
    }
    sort(all(arr) , cmp);
    double ans = 0 ; 
    int g = arr.size() - k ; 
    for(int i = 0 ; i < g ; i++)
    {
        ans += arr[i].to ; 
    }
    cout << fixed << setprecision(18) << ans << endl ; 
}
signed main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while (t--) 
    {
        work();
    }
    return 0;
}