维 修 店
提交文件: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.