问题
https://vjudge.net/problem/UVA-1325
分析
计算出所有的距离,按照大小排序,依此计算调整到该距离时累计的desto数量,还有要等到完全测过一个距离后再进行比较。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=1000+5;
struct Point{
int x,y,z,p,same,diff;
}point[maxn];
struct Dis{
int l,r;
double d;
Dis(int l=0,int r=0,double d=0):l(l),r(r),d(d){}
bool operator < (const Dis &rhs) const {
return d<rhs.d;
}
}dis[(1+maxn)*maxn/2];
inline double distant(double a,double b,double c){
return sqrt(a*a+b*b+c*c);
}
int n;
int main(void){
while(scanf("%d",&n)==1){
int cnt=0,D=0,desto=0,undes=n;
double R=0,cur=0;
for(int i=0;i<n;++i){
scanf("%d%d%d%d",&point[i].x,&point[i].y,&point[i].z,&point[i].p);
point[i].same=1;
point[i].diff=0;
}
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
dis[cnt++]=Dis(i,j,
distant(point[i].x-point[j].x,point[i].y-point[j].y,point[i].z-point[j].z));
}
}
sort(dis,dis+cnt);
for(int i=0;i<cnt;++i){
Dis &temp=dis[i];
if(point[temp.l].p==point[temp.r].p){
point[temp.l].same++;
point[temp.r].same++;
if(point[temp.l].same==point[temp.l].diff) desto--;
if(point[temp.r].same==point[temp.r].diff) desto--;
}else{
point[temp.l].diff++;
point[temp.r].diff++;
if(point[temp.l].diff==point[temp.l].same+1) desto++;
if(point[temp.r].diff==point[temp.r].same+1) desto++;
}
if(i!=cnt-1 && fabs(dis[i].d-dis[i+1].d)<1e-6) continue;
if(desto>D) {
D=desto;
R=temp.d;
}
}
printf("%d\n%.4lf\n",D,R);
}
return 0;
}