这是一道模拟加排序的题目
理解题目意思,包含原点的圆通过移动任意距离使其不包含原点。那么一开始就不包含原点就不需要考虑也就是距离原点距离d>半径r,那么要保存距离原点距离d<半径r的代价,直接算出结果存到vector中即可。最后对于vector排序,保留最小的k个,将剩余的加和输出即可。一定要注意,这里的vector长度不是n!!!用a.size()!!!早上真的昏头了,犯这种错误。。。。。。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair(double,double)
#define pi 3.14159265358979324
void solve(){
int n,k;
// cin>>n>>k;
scanf("%lld%lld",&n,&k);
vector<double>res;
double x,y,r;
for(int i=1;i<=n;i++){
// cin>>x>>y>>r;
scanf("%lf%lf%lf",&x,&y,&r);
double dis=sqrt(x*x+y*y);//距离原点的距离
double t=r-dis;
if(t>0){
res.push_back(t*pi*r*r);
}
}
sort(res.begin(),res.end(),greater<double>());
double ans=0.0;
for(int i=k;i<res.size();i++){
ans+=res[i];
}
// cout<<ans<<endl;
printf("%.8lf",ans);
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
solve();
return 0;
}

京公网安备 11010502036488号