码迷,mamicode.com
首页 > 其他好文 > 详细

【模拟】Codeforces 671A Recycling Bottles

时间:2016-08-18 19:47:42      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

  http://codeforces.com/problemset/problem/671/A

题目大意:

  A和B在一张二维平面上,平面上有N个垃圾,垃圾桶只有一个在T,问把所有垃圾全扔进垃圾桶最少走多远。一次只能拿一个垃圾。允许一个人走另一个人停下来。

  (1 ≤ n ≤ 100 000)  (0 ≤ xi, yi ≤ 109

题目思路:

  【模拟】

  因为每次只能携带一个垃圾,大部分垃圾都是人扔完上一个垃圾后,从垃圾桶出发去捡的。

  而最多有两个垃圾不是被人从垃圾桶出发完再扔到垃圾桶。

  可以先将答案算作都从垃圾桶开始往返捡的距离,再枚举哪一个垃圾被人直接走过去捡能优化答案。注意不要让两个人都选择同一个垃圾。

 

技术分享
  1 //
  2 //by coolxxx
  3 //#include<bits/stdc++.h>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<string>
  7 #include<iomanip>
  8 #include<map>
  9 #include<memory.h>
 10 #include<time.h>
 11 #include<stdio.h>
 12 #include<stdlib.h>
 13 #include<string.h>
 14 //#include<stdbool.h>
 15 #include<math.h>
 16 #define min(a,b) ((a)<(b)?(a):(b))
 17 #define max(a,b) ((a)>(b)?(a):(b))
 18 #define abs(a) ((a)>0?(a):(-(a)))
 19 #define lowbit(a) (a&(-a))
 20 #define sqr(a) ((a)*(a))
 21 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
 22 #define mem(a,b) memset(a,b,sizeof(a))
 23 #define eps (1e-8)
 24 #define J 10
 25 #define mod 1000000007
 26 #define MAX 0x7f7f7f7f
 27 #define PI 3.14159265358979323
 28 #define N 100004
 29 using namespace std;
 30 typedef long long LL;
 31 int cas,cass;
 32 int n,m,lll,ans;
 33 double anss;
 34 struct xxx
 35 {
 36     LL x,y;
 37     double disa,disb,dist;
 38 }q[N],a,b,t;
 39 double dis(xxx aa,xxx bb)
 40 {
 41     return sqrt(sqr(aa.x-bb.x)+sqr(aa.y-bb.y));
 42 }
 43 bool cmp(xxx aa,xxx bb)
 44 {
 45     return aa.dist<bb.dist;
 46 }
 47 int main()
 48 {
 49     #ifndef ONLINE_JUDGE
 50     freopen("1.txt","r",stdin);
 51 //    freopen("2.txt","w",stdout);
 52     #endif
 53     int i,j,ma,mb;
 54     double ax,ay,bx,by,z;
 55 //    for(scanf("%d",&cas);cas;cas--)
 56 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
 57     while(~scanf("%I64d",&a.x))
 58 //    while(~scanf("%d",&n))
 59     {
 60         anss=0;ay=by=0;
 61         scanf("%I64d%I64d%I64d%I64d%I64d",&a.y,&b.x,&b.y,&t.x,&t.y);
 62         scanf("%d",&n);
 63         for(i=1;i<=n;i++)
 64         {
 65             scanf("%I64d%I64d",&q[i].x,&q[i].y);
 66             q[i].disa=dis(a,q[i]);
 67             q[i].disb=dis(b,q[i]);
 68             q[i].dist=dis(t,q[i]);
 69         }
 70         sort(q+1,q+1+n,cmp);
 71         anss=q[1].dist+q[1].dist;
 72         ax=q[1].dist-q[1].disa;
 73         bx=q[1].dist-q[1].disb;
 74         ma=mb=1;
 75         for(i=2;i<=n;i++)
 76         {
 77             anss+=q[i].dist+q[i].dist;
 78             z=q[i].dist-q[i].disa;
 79             if(ax<z)
 80             {
 81                 ay=max(ax,ay);
 82                 ax=z;
 83                 ma=i;
 84             }
 85             else ay=max(ay,z);
 86             z=q[i].dist-q[i].disb;
 87             if(bx<z)
 88             {
 89                 by=max(bx,by);
 90                 bx=z;
 91                 mb=i;
 92             }
 93             else by=max(by,z);
 94         }
 95         if(ma!=mb)z=ax+bx;
 96         else z=max(ax+by,bx+ay);
 97         z=max(z,ax);
 98         z=max(z,bx);
 99         printf("%.12lf\n",anss-z);
100     }
101     return 0;
102 }
103 /*
104 //
105 
106 //
107 */
View Code

 

【模拟】Codeforces 671A Recycling Bottles

标签:

原文地址:http://www.cnblogs.com/Coolxxx/p/5785014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!