街区最短路径问题
2015-09-29 21:58
381 查看
街区最短路径问题
时间限制:3000 ms |
内存限制:65535 KB
难度:4
描述
一个街区有很多住户,街区的街道只能为东西、南北两种方向。
住户只可以沿着街道行走。
各个街道之间的间隔相等。
用(x,y)来表示住户坐在的街区。
例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。
现在要建一个邮局,使得各个住户到邮局的距离之和最少。
求现在这个邮局应该建在那个地方使得所有住户距离之和最小;
输入
第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
m行后是新一组的数据;
输出
每组数据输出到邮局最小的距离和,回车结束;
样例输入
2
3
1 1
2 1
1 2
5
2 9
5 20
11 9
1 1
1 20
样例输出
2
44
import java.util.Scanner;
public
classMain {
public
static void main(String[]
args) {
Scannerreader=
newScanner(System.in);
int
n = reader.nextInt();
while (n-- > 0) {
int
min = 65535;
int
m = reader.nextInt();
Point[]points=
newPoint[m];
for (int
i = 0; i <
m; i++) {
Pointp =
new Point(reader.nextInt(),
reader.nextInt());
points[i] =
p;
}
int
minx = 100;
int
miny = 100;
int
maxx = 0;
int
maxy = 0;
for (int
k = 0; k <
m; k++) {
if (points[k].x <
minx) {
minx =
points[k].x;
}
if (points[k].x >
maxx) {
maxx =
points[k].x;
}
if (points[k].y <
miny) {
miny =
points[k].y;
}
if (points[k].y >
maxy) {
maxy =
points[k].y;
}
}
for (int
i = minx;
i <= maxx;
i++) {
for (int
j = miny;
j <= maxy;
j++) {
int
tempx = 0;
int
tempy = 0;
for (int
k = 0; k <
m; k++) {
tempx += Math.abs(i -
points[k].x);
tempy += Math.abs(j -
points[k].y);
}
if (min >
tempx + tempy) {
min =
tempx + tempy;
}
}
}
System.out.println(min);
}
reader.close();
}
}
class Point {
int
x;
int
y;
public Point(int
x, int
y) {
this.x =
x;
this.y =
y;
}
}
时间限制:3000 ms |
内存限制:65535 KB
难度:4
描述
一个街区有很多住户,街区的街道只能为东西、南北两种方向。
住户只可以沿着街道行走。
各个街道之间的间隔相等。
用(x,y)来表示住户坐在的街区。
例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。
现在要建一个邮局,使得各个住户到邮局的距离之和最少。
求现在这个邮局应该建在那个地方使得所有住户距离之和最小;
输入
第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
m行后是新一组的数据;
输出
每组数据输出到邮局最小的距离和,回车结束;
样例输入
2
3
1 1
2 1
1 2
5
2 9
5 20
11 9
1 1
1 20
样例输出
2
44
import java.util.Scanner;
public
classMain {
public
static void main(String[]
args) {
Scannerreader=
newScanner(System.in);
int
n = reader.nextInt();
while (n-- > 0) {
int
min = 65535;
int
m = reader.nextInt();
Point[]points=
newPoint[m];
for (int
i = 0; i <
m; i++) {
Pointp =
new Point(reader.nextInt(),
reader.nextInt());
points[i] =
p;
}
int
minx = 100;
int
miny = 100;
int
maxx = 0;
int
maxy = 0;
for (int
k = 0; k <
m; k++) {
if (points[k].x <
minx) {
minx =
points[k].x;
}
if (points[k].x >
maxx) {
maxx =
points[k].x;
}
if (points[k].y <
miny) {
miny =
points[k].y;
}
if (points[k].y >
maxy) {
maxy =
points[k].y;
}
}
for (int
i = minx;
i <= maxx;
i++) {
for (int
j = miny;
j <= maxy;
j++) {
int
tempx = 0;
int
tempy = 0;
for (int
k = 0; k <
m; k++) {
tempx += Math.abs(i -
points[k].x);
tempy += Math.abs(j -
points[k].y);
}
if (min >
tempx + tempy) {
min =
tempx + tempy;
}
}
}
System.out.println(min);
}
reader.close();
}
}
class Point {
int
x;
int
y;
public Point(int
x, int
y) {
this.x =
x;
this.y =
y;
}
}
相关文章推荐
- Android Studio快捷键
- JAVA字符串的方法
- netbeans ide8 如何修改为英文版
- 二维数组求鞍点 ---- 2015/9/29
- 题目3 : Fibonacci
- 剑指offer-反转链表
- 行编辑器之堆栈法
- 【转】 Spinner的常用技巧
- 题目1 : Farthest Point
- 空指针异常错误集
- TI ZigBee FAQ 常见问题解答
- 磁盘IO单线程顺序写时最快的,如果多线程写,磁盘的磁头要不断重新寻址,所以写入速度反而会慢
- Linux内存管理 【转】
- 如何正确学习JavaScript
- node.js下LDAP查询实践
- JAG2015 Wall Making Game
- iOS界面编程-UIActivityIndicatorView
- hiho1233--Boxes(BFS)
- 难题总结及解决方法
- eclipse检测不到手机