思路:

创建一个大根堆优先队列,存放能减少的值,x,y,然后根据能减少的值一步一步减,如果y的值为0就直接出列。 相当直球的一道题目,赛时没看到只能减y以为很复杂,所以跳了写D的bfs(QAQ)。

代码:

#include<bits/stdc++.h>
#define PI3 array<long double,3>
#define int long double
using namespace std;
int n,w;
priority_queue<PI3,vector<PI3>> pr;
int val(int x,int y) {
	int z=sqrt(x*x+y*y)-sqrt(x*x+(y-1)*(y-1));
	return z;
}
signed main() { 	
	cin>>n>>w;
	int sum=0;
	for(int i=1;i<=n;i++) {
		int x,y; cin>>x>>y;
		int z=val(x,y);
		sum+=sqrt(x*x+y*y);
		pr.push({z,x,y});
	}
	while(!pr.empty()&&w) {
		PI3 top=pr.top();
		pr.pop();
		sum-=top[0];
		top[2]--;
		if(top[2]>0) {
			int z=val(top[1],top[2]);
			pr.push({z,top[1],top[2]});
		}
		w--; 
	}
	cout<<fixed<<setprecision(10)<<sum;
}