蓝桥杯 邮局

最后两个超时,求大神解答

#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; 
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值