C. Diamond Miner
题目
思路
先对x轴上的点与y轴上的点取绝对值排序,然后从小到大依次取x与y,这样得到的值最小
AC代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define sdf(n) scanf("%lf",&n)
#define pdf(n) printf("%.15f",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define pre(n) for(ll i=1;i<=n;i++)
#define rep(n) for(ll i=n;i>=1;i--)
#define pi pair<ll,ll>
int main()
{
ll t,n,i,j,k;
double sum=0,x,y;
sl(t);
while(t--){
sl(n);
double a[n],b[n];
j=0,k=0,sum=0.0;
for(i=0;i<2*n;i++){
sdf(x),sdf(y);
if(x==0.0)b[j++]=fabs(y);
else a[k++]=fabs(x);}
sort(a,a+n),sort(b,b+n);
for(i=0;i<n;i++){
sum+=sqrt(a[i]*a[i]*1.0+b[i]*b[i]*1.0);
}
pdf(sum);
puts("");
}
return 0;
}