码迷,mamicode.com
首页 > 其他好文 > 详细

通信基站(为毛wa)

时间:2016-03-01 21:01:42      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

Description

技术分享

Input

技术分享

Output

技术分享

Sample Input

2 2 1 1 0 0 4 4 3 100 1 0 0 1 1 500 500

Sample Output

2.00 201.41
题解:用容斥的方法,选出所有情况,对于每选的数,找别的点到已经选的点的最短距离与R的乘积;加上,找最小值;
但是一直wa,为毛,思路感觉也没错;
代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int INF=0xfffffff;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
typedef long long LL;
const int MAXN=110;
double lx[MAXN],ly[MAXN];
double mp[MAXN][MAXN];
int N;
double ans;
double C,R;
double d[MAXN];
double getl(int i,int j){
    double y=ly[j]-ly[i],x=lx[j]-lx[i];
    return sqrt(x*x+y*y);
}
void work(){
    ans=INF;
    for(int i=1;i<(1<<N);i++){
        double temp=0;
        for(int k=0;k<N;k++)d[k]=INF;
        for(int j=0;j<N;j++){
            if(i&(1<<j)){
                temp+=C;
                for(int k=0;k<N;k++){
                    d[k]=min(d[k],R*mp[k][j]);
                }
                d[j]=0;
            //    printf("%d ",j);
            }
        }
        //puts("");
        for(int i=0;i<N;i++)temp+=d[i];
        //for(int k=0;k<N;k++)printf("d[%d]=%.1lf ",k,d[k]);puts("");
        ans=min(ans,temp);
    }
    printf("%.2f\n",ans);
}
int main(){
    int T;
    SI(T);
    while(T--){
        scanf("%d%lf%lf",&N,&C,&R);
        for(int i=0;i<N;i++){
            scanf("%lf%lf",&lx[i],&ly[i]);
        }
        for(int i=0;i<N;i++)
            for(int j=i+1;j<N;j++)
                mp[i][j]=mp[j][i]=getl(i,j);
            work();
    }
    return 0;
}

 

通信基站(为毛wa)

标签:

原文地址:http://www.cnblogs.com/handsomecui/p/5232340.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!