问题描述
C村住着n户村民,由于交通闭塞,C村的村民只能通过信件与外界交流。为了方便村民们发信,C村打算在C村建设k个邮局,这样每户村民可以去离自己家最近的邮局发信。
现在给出了m个备选的邮局,请从中选出k个来,使得村民到自己家最近的邮局的距离和最小。其中两点之间的距离定义为两点之间的直线距离。
现在给出了m个备选的邮局,请从中选出k个来,使得村民到自己家最近的邮局的距离和最小。其中两点之间的距离定义为两点之间的直线距离。
输入格式
输入的第一行包含三个整数n, m, k,分别表示村民的户数、备选的邮局数和要建的邮局数。
接下来n行,每行两个整数x, y,依次表示每户村民家的坐标。
接下来m行,每行包含两个整数x, y,依次表示每个备选邮局的坐标。
在输入中,村民和村民、村民和邮局、邮局和邮局的坐标可能相同,但你应把它们看成不同的村民或邮局。
接下来n行,每行两个整数x, y,依次表示每户村民家的坐标。
接下来m行,每行包含两个整数x, y,依次表示每个备选邮局的坐标。
在输入中,村民和村民、村民和邮局、邮局和邮局的坐标可能相同,但你应把它们看成不同的村民或邮局。
输出格式
输出一行,包含k个整数,从小到大依次表示你选择的备选邮局编号。(备选邮局按输入顺序由1到m编号)
样例输入
5 4 2
0 0
2 0
3 1
3 3
1 1
0 1
1 0
2 1
3 2
0 0
2 0
3 1
3 3
1 1
0 1
1 0
2 1
3 2
样例输出
2 4
数据规模和约定
对于30%的数据,1<=n<=10,1<=m<=10,1<=k<=5;
对于60%的数据,1<=m<=20;
对于100%的数据,1<=n<=50,1<=m<=25,1<=k<=10。
代码如下:
对于60%的数据,1<=m<=20;
对于100%的数据,1<=n<=50,1<=m<=25,1<=k<=10。
import java.util.Scanner;
public class Main {
static int n, m, k, j, f1, f2;
static int[][] a = new int[55][2];
static int[][] b = new int[27][2];
static int[] c = new int[12];
static int[] d = new int[55];
static float[][] yc = new float[27][55];
static float s = 1000000000;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int i, j;
int[] o = new int[12];
float[] w = new float[55];
n = input.nextInt();
m = input.nextInt();
k = input.nextInt();
for (i = 1; i <= n; i++) {
a[i][0] = input.nextInt();
a[i][1] = input.nextInt();
}
for (i = 1; i <= m; i++) {
b[i][0] = input.nextInt();
b[i][1] = input.nextInt();
for (j = 1; j <= n; j++)
yc[i][j] = (float) Math.sqrt((a[j][0] - b[i][0])
* (a[j][0] - b[i][0]) + (a[j][1] - b[i][1])
* (a[j][1] - b[i][1]));
}
dfs(0, 1, o, w, 0);
for (i = 0; i < k; i++)
System.out.print(c[i] + " ");
}
private static void dfs(int t, int i, int o[], float w[], float sum) {
if (i <= m + 1) {
if (t == k) {
if (sum < s) {
s = sum;
for (j = 0; j < k; j++)
c[j] = o[j];
}
} else if (i <= m && t < k) {
float[] ww = new float[55];
for (j = 1; j <= n; j++)
ww[j] = w[j];
dfs(t, i + 1, o, w, sum);
f1 = 1;
f2 = 0;
if (d[i] == 0) {
o[t] = i;
if (t > 0) {
f2 = 1;
for (j = 1; j <= n; j++) {
if (ww[j] > yc[i][j]) {
sum = sum - ww[j] + yc[i][j];
ww[j] = yc[i][j];
f1 = 0;
}
}
} else {
for (j = 1; j <= n; j++) {
sum += yc[i][j];
ww[j] = w[j] = yc[i][j];
}
}
if (f1 == 1 && f2 == 1) {
d[i] = 1;
dfs(t, i + 1, o, w, sum);
} else
dfs(t + 1, i + 1, o, ww, sum);
}
}
}
}
}
运行结果:
5 4 2
0 0
2 0
3 1
3 3
1 1
0 1
1 0
2 1
3 2
2 4