題目來源自http://acm.nyist.net/JudgeOnline/problem.php?pid=7
描述一個街區有很多住戶,街區的街道只能為東西、南北兩種方向。
住戶只可以沿著街道行走。
各個街道之間的間隔相等。
用(x,y)來表示住戶坐在的街區。
例如(4,20),表示用戶在東西方向第4個街道,南北方向第20個街道。
現在要建一個郵局,使得各個住戶到郵局的距離之和最少。
求現在這個郵局應該建在那個地方使得所有住戶距離之和最小;
2 3 1 1 2 1 1 2 5 2 9 5 20 11 9 1 1 1 20
2 44
最短路徑肯定是在這幾個點所圍成的圈內的,這樣直接遍歷求和,然後取最小值就好了,代碼如下
1 #include"header_file.h"
2 using namespace std;
3
4 int get_max(vector<int> v)
5 {
6 int max;
7 max=v[0];
8 for(int i=0;i<v.size();i++)
9 {
10 if(max<v[i])
11 {
12 max=v[i];
13 }
14 }
15 return max;
16 }
17
18 int get_min(vector<int> v)
19 {
20 int min;
21 min=v[0];
22 for(int i=0;i<v.size();i++)
23 {
24 if(min>v[i])
25 {
26 min=v[i];
27 }
28 }
29 return min;
30 }
31
32 int get_sum(vector<int> vx,vector<int> vy,int x,int y)
33 {
34 int sum=0;
35 for(int i=0;i<vx.size();i++)
36 {
37 if((x-vx[i])>=0)
38 {
39 sum=sum+x-vx[i];
40 }
41 else
42 {
43 sum=sum+vx[i]-x;
44 }
45 }
46 for(int i=0;i<vy.size();i++)
47 {
48 if((y-vy[i])>=0)
49 {
50 sum=sum+y-vy[i];
51 }
52 else
53 {
54 sum=sum+vy[i]-y;
55 }
56 }
57 return sum;
58 }
59
60 int get_short_path(vector<int> vx,vector<int> vy,int m)
61 {
62 int vx_max,vx_min;
63 int vy_max,vy_min;
64 vx_max=get_max(vx);
65 vx_min=get_min(vx);
66 vy_max=get_max(vy);
67 vy_min=get_min(vy);
68
69 vector<int> v;
70 for(int i=vx_min;i<=vx_max;i++)
71 {
72 for(int j=vy_min;j<=vy_max;j++)
73 {
74 int sum;
75 sum=get_sum(vx,vy,i,j);
76 v.push_back(sum);
77 }
78 }
79
80 return get_min(v);
81 }
82
83 int main(void)
84 {
85 int m;
86 cout<<"input m:";
87 cin>>m;
88
89 vector<int> vx,vy;
90
91 for(int i=0;i<m;i++)
92 {
93 int x,y;
94 cin>>x>>y;
95 vx.push_back(x);
96 vy.push_back(y);
97 }
98
99 cout<<get_short_path(vx,vy,m);
100 }