zoukankan      html  css  js  c++  java
  • Codeforces Round #352 (Div. 1) A. Recycling Bottles 暴力

    A. Recycling Bottles

    题目连接:

    http://www.codeforces.com/contest/671/problem/A

    Description

    It was recycling day in Kekoland. To celebrate it Adil and Bera went to Central Perk where they can take bottles from the ground and put them into a recycling bin.

    We can think Central Perk as coordinate plane. There are n bottles on the ground, the i-th bottle is located at position (xi, yi). Both Adil and Bera can carry only one bottle at once each.

    For both Adil and Bera the process looks as follows:

    Choose to stop or to continue to collect bottles.
    If the choice was to continue then choose some bottle and walk towards it.
    Pick this bottle and walk to the recycling bin.
    Go to step 1.
    Adil and Bera may move independently. They are allowed to pick bottles simultaneously, all bottles may be picked by any of the two, it's allowed that one of them stays still while the other one continues to pick bottles.

    They want to organize the process such that the total distance they walk (the sum of distance walked by Adil and distance walked by Bera) is minimum possible. Of course, at the end all bottles should lie in the recycling bin.

    Input

    First line of the input contains six integers ax, ay, bx, by, tx and ty (0 ≤ ax, ay, bx, by, tx, ty ≤ 109) — initial positions of Adil, Bera and recycling bin respectively.

    The second line contains a single integer n (1 ≤ n ≤ 100 000) — the number of bottles on the ground.

    Then follow n lines, each of them contains two integers xi and yi (0 ≤ xi, yi ≤ 109) — position of the i-th bottle.

    It's guaranteed that positions of Adil, Bera, recycling bin and all bottles are distinct.

    Output

    Print one real number — the minimum possible total distance Adil and Bera need to walk in order to put all bottles into recycling bin. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

    Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct if .

    Sample Input

    3 1 1 2 0 0
    3
    1 1
    2 1
    2 3

    Sample Output

    11.084259940083

    题意

    有A和B两个人,地面上有n个空瓶子,现在这A和B要去把这些空瓶子扔到辣鸡桶里面去

    每个人同时只能拿一个辣鸡,问你这两人最少走多长,就可以把这些辣鸡全部处理干净?

    给你一开始A,B,和辣鸡桶位置

    题解:

    首先把特殊情况特判掉,就是只由A去捡瓶子,和只有B去捡瓶子的情况

    然后只由两个人和路线是 A-瓶子-垃圾桶,B-瓶子-辣鸡桶,其他的都是垃圾桶-瓶子-辣鸡桶

    所以我们排序之后,暴力2*2去枚举离A最近的,和离B最近的那个就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+6;
    double ax,ay,bx,by,tx,ty;
    struct node
    {
        double x,y;
        double dis1,dis2,dis3;
        int id;
    }p[maxn],p1[maxn],p2[maxn];
    int n;
    double dis(double x,double y,double x1,double y1)
    {
        return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
    }
    bool cmp1(node a,node b)
    {
        return a.dis1-a.dis3<b.dis1-b.dis3;
    }
    bool cmp2(node a,node b)
    {
        return a.dis2-a.dis3<b.dis2-b.dis3;
    }
    int main()
    {
        scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&tx,&ty);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y),p[i].id=i;
        double ans = 0;
        for(int i=1;i<=n;i++)
        {
            p[i].dis1=dis(p[i].x,p[i].y,ax,ay);
            p[i].dis2=dis(p[i].x,p[i].y,bx,by);
            p[i].dis3=dis(p[i].x,p[i].y,tx,ty);
            ans+=p[i].dis3;
        }
        ans*=2;
        double Ans=1e18;
        for(int i=1;i<=n;i++)p1[i]=p[i],p2[i]=p[i];
        sort(p1+1,p1+1+n,cmp1);
        sort(p2+1,p2+1+n,cmp2);
        for(int i=1;i<=100&&i<=n;i++)
        {
            for(int j=1;j<=100&&j<=n;j++)
            {
                if(p1[i].id==p2[j].id)continue;
                double ans2=ans,ans3=ans,ans4=ans,ans5=ans;
                ans2 = ans2 + p1[i].dis1 - p1[i].dis3 + p2[j].dis2 - p2[j].dis3;
                ans3 = ans3 + p1[j].dis1 - p1[j].dis3 + p2[i].dis2 - p2[i].dis3;
                ans4 = ans4 + p1[i].dis1 - p1[i].dis3;
                ans5 = ans5 + p2[j].dis2 - p2[j].dis3;
                Ans=min(Ans,ans2);
                Ans=min(Ans,ans3);
                Ans=min(Ans,ans4);
                Ans=min(Ans,ans5);
            }
            double ans4=ans,ans5=ans;
            ans4 = ans4 + p1[i].dis1 - p1[i].dis3;
            ans5 = ans5 + p2[i].dis2 - p2[i].dis3;
            Ans=min(Ans,ans4);
            Ans=min(Ans,ans5);
        }
        printf("%.12f
    ",Ans);
    }
  • 相关阅读:
    2018暑假假期周进度报告——第八周
    zf-关于评价器的开关所在的配置文件,与代码如何修改。
    不要点击一个功能就创建一个新的网页,要尽量少的新创建页面(例如:办事指南,点击一个部门创建一个网页,选择具体事项时,又创建一个网页,这样创建的网页太多)
    实现jsp页面显示用户登录信息,利用session保存。
    zf-关于更换页面,的各种问题。
    报错 BeanFactory not initialized or already closed
    Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds
    如果在一个实现类中改变另外一个类中的变量,但是怎么改网页上都没变化的问题。
    如果更新包更新包现场,class文件更新过去,没有改变,及时删掉,照样能进那个模块的问题。
    使用内链接(A a inner join B b on a.xx = b.xx)查询2个表中某一列的相同的字段。
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5486462.html
Copyright © 2011-2022 走看看