您的位置:首页 > 其它

蓝桥杯 邮局

2016-11-29 12:10 78 查看
最后两个超时,求大神解答

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

#define MAXN 51
#define MAXM 26
#define MAXK 11
#define INF 100000000000

struct point{
int x,y;
}home[MAXN];
double dis[MAXM][MAXN];
int n,m,k,ans=INF;
int post[MAXK],upost[MAXK];
double s[MAXN];

double Distance(int x1,int y1,int x2,int y2)
{
int a=x1-x2;
int b=y1-y2;
return sqrt(double(a*a+b*b));
}

void dfs(int i,int len,double s[],double sum)
{
if (len==k)
{
if (sum<ans)
{
ans=sum;
for (int j=0;j<k;j++){
upost[j]=post[j];
}
}
return ;
}

int p=len+m-i;
if (p<k)return;
else if(p>k) dfs(i+1,len,s,sum);

if (len==0)
{
post[len]=i;
for (int j=0;j<n;j++){
s[j]=dis[i][j];
sum+=s[j];
}
dfs(i+1,len+1,s,sum);
}else{
double scopy[MAXN];
bool change=false;
double b=0;
for (int j=0;j<n;j++){
if (dis[i][j]<s[j])
{
scopy[j]=dis[i][j];
change=true;
}else scopy[j]=s[j];
b+=scopy[j];
}
if (change)
{
post[len]=i;
dfs(i+1,len+1,scopy,b);
}
}
}

int main()
{
int a,b;
while(cin>>n>>m>>k)
{
for (int i=0;i<n;i++){
cin>>home[i].x>>home[i].y;
}
for (int i=0;i<m;i++){
cin>>a>>b;
for (int j=0;j<n;j++){
dis[i][j]=Distance(home[j].x,home[j].y,a,b);
}
}
dfs(0,0,s,0);
for (int i=0;i<k;i++){
cout<<upost[i]+1<<" ";
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: