Codeforces 672C Recycling Bottles 几何+贪心

来源:互联网 发布:常熟淘宝培训 编辑:程序博客网 时间:2024/05/22 13:21

点击打开链接

//题意:给出平面上n个bottle 两个人和bin的坐标 求把bot捡完所需要最短时间 n<=1e5
//除了第一次是从pos->bot->bin 其余之后的路线都为bin->bot->bin
//贪心假设:两人初始都在bin时 ans=2*sigma(distance(bin,bot(i))) 乘2为来回
//现在由于每个人第一次选择bot不同 导致时间的变化T
//若两人分别选择bot(i,j) ans=ans+T  T=(-dis(bot(i),bin)-dis(bot(j),bin)+dis(bot(i),A)+dis(bot(j),B) 

//先求出数组d=dis(A,bot(i))-dis(bot(i),bin))

//对d排序,枚举第一个人选bot后就能快速在d2中找到最小的bot(j) 注意特判 有一个人不拿bot即可

  

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e5+20;const ll inf=1e18;pair<double,double> p[N];int n;struct node{double d;int u;//bot u}d1[N],d2[N];bool cmp(node a,node b){return a.d<b.d;}double dis(double x1,double y1,double x2,double y2){return sqrt((ll)(y2-y1)*(y2-y1)+(ll)(x2-x1)*(x2-x1));}int main(){double ax,ay,bx,by,tx,ty;cin>>ax>>ay>>bx>>by>>tx>>ty;cin>>n;double ans=0;for(int i=0;i<n;i++){cin>>p[i].first>>p[i].second;double x=p[i].first,y=p[i].second;d1[i].d=dis(ax,ay,x,y)-dis(tx,ty,x,y); d2[i].d=dis(bx,by,x,y)-dis(tx,ty,x,y);d1[i].u=d2[i].u=i;ans+=(2.0*dis(tx,ty,x,y));}sort(d1,d1+n,cmp);sort(d2,d2+n,cmp);double res=inf;for(int i=0;i<n;i++)//枚举A选择的bot,排好序能快速算出最小的b {for(int j=0;j<2;j++)//防止bot(i)==bot(j){if(d1[i].u!=d2[j].u){res=min(res,d1[i].d+d2[j].d);break;}}}double ans2=ans,res2=inf;ans=ans+res;//特判:其中一个人一个都没捡 捡的人肯定挑最少的捡res2=min(d1[0].d,d2[0].d);ans2=ans2+res2;printf("%.12lf\n",min(ans,ans2));return 0;}


0 0
原创粉丝点击