zoukankan      html  css  js  c++  java
  • [stupid]愚蠢的村庄

    题目描述

    背景
    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 }




  • 相关阅读:
    函数式编程
    javascript RegExp类型 学习小记
    javascript Date类型 学习笔记
    post 提交数据
    git学习笔记
    Winform DevExpress控件库(一) 使用SplashScreenManager控件定制程序加载页面
    .net 对json数据进行读取
    [WPF]TextTrimming截断后,ToolTip显示完整信息
    删除程序自身
    c/s项目记住账号密码功能
  • 原文地址:https://www.cnblogs.com/noip/p/2326198.html
Copyright © 2011-2022 走看看