您的位置:首页 > 其它

Codeforces 672C Recycling Bottles 几何+贪心

2016-12-15 22:42 281 查看
点击打开链接

//题意:给出平面上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
;
int n;

struct node{
double d;
int u;//bot u
}d1
,d2
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: