Codeforces 671A Recycling Bottles(贪心+思维)

题目链接:http://codeforces.com/problemset/problem/671/A

题目大意:
给你两个人的位置和一个箱子的位置,然后给出n个瓶子的位置,要求让至少一个人去捡瓶子放到箱子里面去,
一次只能拿一个瓶子,求把全部瓶子捡完之后的距离总和最小。
解题思路:
开始有两个起点A,B。除了从A或B出发拿瓶子并回到箱子距离不确定,其他时候肯定要从箱子到瓶子再回到箱子,距离就是dis(箱子到瓶子)*2.
关于从A,B出发拿瓶子,分三种情况:
①只有A拿
②只有B拿
③A拿一个瓶子,B拿一个瓶子(两个瓶子肯定不同)
然后枚举即可。

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 
 7 double dis(int x,int y,int a,int b){
 8     return sqrt(1.0*(x-a)*(x-a)+1.0*(y-b)*(y-b));
 9 }
10 
11 int main(){
12     int ax,ay,bx,by,tx,ty;
13     scanf("%d%d%d%d%d%d",&ax,&ay,&bx,&by,&tx,&ty);
14     double sum=0;
15     double ma=1e18,mb=1e18,mab=1e18;
16     int n;
17     scanf("%d",&n);
18     for(int i=1;i<=n;i++){
19         int x,y;
20         scanf("%d%d",&x,&y);
21         double dt=dis(tx,ty,x,y);
22         double da=dis(ax,ay,x,y)-dt;//让A拿的代价 
23         double db=dis(bx,by,x,y)-dt;//让B拿的代价
24         sum+=dt*2;
25         mab=min(mab,min(ma+db,mb+da));
26         ma=min(ma,da),mb=min(mb,db);
27     }
28     printf("%.12f",sum+min(mab,min(ma,mb)));//A拿一个B拿一个,或只让A拿,或只让B拿 
29     return 0;
30 }

 

posted @ 2018-11-01 20:20  Yeader  阅读(420)  评论(3编辑  收藏  举报