题目大意
矿工在y轴,钻石在x轴,每个矿工只能采一个钻石,采矿时要花费sqrt(xx+yy)的能量,要我们花费最少的能量
题解
将矿工们和钻石分别排序,可以试着画图,只有在离原点第k个位置的矿工来挖第k个钻石,才能让线段不交叉,他们形成的线段和才能最小
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=1e5+5;
int x[MAX];
int y[MAX];
int main(){
int t,n,xx,yy,xi,yi;
scanf("%d",&t);
while(t--){
xi=yi=0;
scanf("%d",&n);
for(int i=0;i<2*n;i++){
scanf("%d%d",&xx,&yy);
if(xx){
if(xx<0){
xx=-xx;
}
x[xi++]=xx;
}else{
if(yy<0){
yy=-yy;
}
y[yi++]=yy;
}
}
sort(x,x+xi);
sort(y,y+yi);
double ans=0;
for(int i=0;i<n;i++){
ans+=sqrt(1.0*x[i]*x[i]+1.0*y[i]*y[i]);
}
printf("%.15lf\n",ans);
}
}