2017.6.6测试 题三 维修店

本文介绍了一种算法,用于帮助公司在多个候选城市中选择最佳位置开设维修店,目标是最小化最远客户到最近维修店的距离。算法通过计算城市间的距离,并采用递归方式尝试不同组合,最终找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

维 修 店

提交文件:repair.exe

输入文件:repair.in

输出文件:repair.out

 

问题描述:

A公司想在N个城市中选择M个来开维修店,而购买了A公司产品的人如果要维修,可以送到最近的维修店。A公司想知道,选择哪些城市开维修店可以使得离维修店最远的那个城市离维修店的距离尽量小。给出N个城市的坐标(城市的坐标是唯一的),你能帮A公司求出这个最小的距离吗?

 

输入格式:

输入的第一行包含两个整数,分别是城市数N以及维修店数M。

接下来的N行各包含两个数,分别是每个城市的X坐标和Y坐标。

 

输出格式:

输出只有一行,包含一个小数,为所求的最小距离,保留2位有效数字。

 

输入样例:

输出样例:

4 2

0 0

1 1

2 4

3 9

3.16

 

数据范围:

对于50%的数据,1 ≤M ≤ N ≤ 10,-100 ≤ X,Y ≤ 100;

对于所有的数据,1 ≤ M ≤N ≤ 20,-1000 ≤ X,Y ≤ 1000。

维 修 店

提交文件:repair.exe

输入文件:repair.in

输出文件:repair.out

var
 a:array[0..20,0..20]of real;//a[i,j]:从i到j的距离
 x,y,f:array[0..20]of real;
 v:array[0..20]of boolean;
 n,m,i,j,k:longint;
 ans:real;
function min(a,b:real):real;
begin
 if a<b then exit(a);
 exit(b);
end;
procedure try(d,p:longint);
var
 ff:array[0..20]of real;
 i,j:longint;
 t:real;
begin
 for i:=p+1 to n-(m-d) do
  begin
   if d>m then//如果走出去了
           begin
            t:=0;
            for j:=1 to n do
             if v[j] and (f[j]>t) then t:=f[j];//统计目前走过的距离
            ans:=min(ans,t);
           end
          else
           begin
            v[i]:=false;
            ff:=f;
            for j:=1 to n do
             if v[j] then f[j]:=min(f[j],a[i,j]);
            try(d+1,i);//找下个城市
            v[i]:=true;
            f:=ff;
           end;
  end;
end;
begin
 readln(n,m);
 for i:=1 to n do
  readln(x[i],y[i]);
 for i:=1 to n do
  for j:=1 to n do
   if i<>j then a[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]))//求距离(sqrt+sqr相当于求绝对值)
           else a[i,j]:=maxlongint;
 fillchar(f,sizeof(f),$7F);
 fillchar(v,sizeof(v),true);
 ans:=maxlongint;
 try(1,0);
 writeln(ans:0:2);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值