Hypertransmission UVA - 1325 暴力枚举

问题

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值