Codeforces Round #706 (Div. 2) C. Diamond Miner

传送门

题目大意

矿工在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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值