蓝桥杯 邮局
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; }
相关文章推荐
- 蓝桥杯历届试题 邮局(DFS)
- 蓝桥杯真题:C村建k个邮局
- 蓝桥杯--- 历届试题 邮局 (深搜+暴力)(动态待解决)
- 蓝桥杯真题:C村建k个邮局
- 蓝桥杯 历届试题 邮局 (dfs得了40分,其他数据超时,代码贴出来以后改正)
- 蓝桥杯 邮局
- 蓝桥杯 历届试题 邮局 2017-09-24 修改
- 算法-蓝桥杯习题(4-1)
- 蓝桥杯 - 凑算式
- 2015第六届蓝桥杯C++B组第一题:奖券数目
- 蓝桥杯练手之二维数组再学习
- 蓝桥杯_生日蜡烛
- 2018蓝桥杯模拟赛--快速幂
- 蓝桥杯--算法提高 最大乘积(DFS)
- 蓝桥杯- 奇妙的数字-java
- 2018 蓝桥杯省赛 B 组模拟赛(五)蒜头君下棋
- 蓝桥杯 算法提高 分苹果
- 蓝桥杯-凑算式-java
- 2018蓝桥杯模拟赛(一)G【math 递推】
- TCP/IP协议详解——邮差与邮局