题目描述
背景
Stupid家族的成员们生活在一个名为Stupid的村庄。
话说村里的人要喝水都得到很远很远的另一个Genius村庄打水,这并不算什么,因为Stupid村庄的村民都很勤劳不怕苦。最郁闷的是Genius村庄的村民总是无端BS我们的村民,老是问一些“1+1等于多少”的问题,害得我们答不上来。于是hyc提出要在我们自己村里建一口水井。抛开受BS的日子。
描述
Stupid村庄的村民是愚蠢的,这个村庄也是愚蠢的,他们不知道如何布置自己的村庄,所以村庄的结构很简单。我们设整个村庄处在一个坐标系的第一象限。
而在Stupid村庄里有N座房子,这房子也是愚蠢的。它很扁,可以近似得看做一条直线;它还是平行于坐标轴的(Stupid村民是迷信的…方方正正才是美…)。
现在,要在村里建一水井,我们要使所有房子到水井的距离和最短。
设某一房子的两端点分别为(1,3),(3,3)。若水井的横坐标1〈=x〈=3, 则水井到房子的距离为 abs(水井纵坐标-1),即图中L1,否则(x〈 1 或 x 〉3),距离为min{水井到左端点的距离,水井到右端点的距离},即图中L2。换句话说,让村民们来打水所走的距离和最短。
输入格式
输入文件village.in的第一行为一个正整数N(N〈=100)。
接下来N行输入N座房子的信息,每行为四个非负整数,分别表示房子两端点的坐标。
房子的所有坐标都为0到100间的非负整数。
输出格式
输出文件village.out有且仅有一行,为所求的最短距离(保留两位小数)。
代码实现:
View Code
1 #include<iostream>
2 #include<math.h>
3 using namespace std;
4
5 int n;int minx1=10000,maxx1=0,miny1=10000,maxy1=0,x2,y2;
6
7 struct a1{
8 int minx,miny,maxx,maxy;
9 void init(){
10 minx*=10;
11 miny*=10;
12 maxx*=10;
13 maxy*=10;
14 if(minx>maxx)
15 swap(minx,maxx);
16 if(miny>maxy)
17 swap(miny,maxy);
18 }
19 }a[101];
20
21 void input(){
22 int i;
23 cin>>n;
24 for(i=1;i<=n;i++)
25 {cin>>a[i].minx>>a[i].miny>>a[i].maxx>>a[i].maxy;
26 a[i].init();
27 if(a[i].minx<minx1) minx1=a[i].minx;
28 if(a[i].maxx>maxx1) maxx1=a[i].maxx;
29 if(a[i].miny<miny1) miny1=a[i].miny;
30 if(a[i].maxy>maxy1) maxy1=a[i].maxy;
31 }
32 }
33
34 double dist(int x4,int y4,int x5,int y5){
35 return sqrt((x5-x4)*(x5-x4)+(y5-y4)*(y5-y4));
36 }
37
38 double count(int x3,int y3){
39 int i;double d=0;
40 for(i=1;i<=n;i++)
41 {
42 if(a[i].miny==a[i].maxy)
43 {
44 if(x3>=a[i].minx&&x3<=a[i].maxx)
45 d+=abs(y3-a[i].miny);
46 else if(x3<=a[i].minx)
47 d+=dist(x3,y3,a[i].minx,a[i].miny);
48 else if(x3>=a[i].maxx)
49 d+=dist(x3,y3,a[i].maxx,a[i].maxy);
50 }
51 else
52 {
53 if(y3<=a[i].maxy&&y3>=a[i].miny)
54 d+=abs(x3-a[i].maxx);
55 else if(y3<=a[i].miny)
56 d+=dist(x3,y3,a[i].minx,a[i].miny);
57 else if(y3>=a[i].maxy)
58 d+=dist(x3,y3,a[i].maxx,a[i].maxy);
59 }
60
61 }
62 return d;
63 }
64
65 double total=10000000;
66
67 void slove(){
68 int i,j;double k;
69 for(i=minx1;i<=maxx1;i+=20)
70 for(j=miny1;j<=maxy1;j+=20)
71 {
72 k=count(i,j);
73 if(k<total)
74 {total=k;x2=i;y2=j;}
75 }
76
77 for(i=x2-20;i<=x2+20;i++)
78 for(j=y2-20;j<=y2+20;j++)
79 {
80 k=count(i,j);
81 if(k<total)
82 total=k;
83 }
84
85 }
86
87
88
89 int main()
90 {
91 input();
92 slove();
93 printf("%.2lf",total/10.0);
94 system("pause");
95 return 0;
96
97 }