codeforces 671A

来源:互联网 发布:关于大数据的书籍推荐 编辑:程序博客网 时间:2024/06/10 01:50

题意:给你两个人的位置和一个箱子的位置,然后给出n个瓶子的位置,要求让至少一个人去捡瓶子放到箱子里面去,一次只能拿一个瓶子,求把全部瓶子捡完之后的距离总和最小

思路:仔细想想,如果一个人去捡了某个瓶子那么他之后肯定会走到箱子的位置上去,然后再去捡的话就是箱子到某个瓶子的距离,那么我们可以分这样三种情况考虑,人物A一个人捡完了所有的瓶子,人物B一个人捡完了所有瓶子,人物A捡了某个瓶子  人物B捡了某个瓶子,这两个瓶子肯定不一样,那么当他们都回到箱子的时候无论谁去捡剩下的瓶子其距离都是固定的,那么我们可以先这样 计算出所有瓶子到箱子的距离然后加上得到结果sum,然后如果人物A去捡了一个第i个瓶子那么 sum+dis(A,i)-dis(箱子, i),依次去算剩下的两种情况,然后三者中取一个最小值。

#include<cmath>#include<cstring>#include<stdio.h>#include<algorithm>using namespace std;const int qq = 100000+10;double x[qq],y[qq];double ax,ay,bx,by,tx,ty;double f(double xx, double yy, int id){return sqrt((xx-x[id])*(xx-x[id])+(yy-y[id])*(yy-y[id]));}int main(){scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&tx,&ty);int n;scanf("%d",&n);double sum = 0;double ma=1E12,mb=1E12,mab=1E12;for(int i=1; i<=n; ++i){scanf("%lf%lf",&x[i],&y[i]);double dt=f(tx, ty, i);double da=f(ax, ay, i)-dt;double db=f(bx, by, i)-dt;sum += dt*2;mab=min(mab, min(ma+db, mb+da));ma=min(ma, da), mb=min(mb, db);}printf("%.11lf\n",sum+min(mab,min(ma, mb)));return 0;}


0 0
原创粉丝点击