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;
}
//题意:给出平面上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;
}
相关文章推荐
- 【codeforces 672 C】【计算几何+贪心】Recycling Bottles【有两个人和一个垃圾桶,n个瓶子,把每个瓶子捡起来然后扔到垃圾箱中,每人最多带一个瓶子,求最短总距离】
- 1.13 Codeforces 30D Kings Problem 贪心 计算几何
- Codeforces 583 DIV2 GCD Table 贪心
- 【CodeForces】500B - New Year Permutation(Floyd)(贪心)
- Codeforces 529B Group Photos 2 (one mirror version) [贪心]
- Codeforces 898D Alarm Clock (贪心好题)
- Codeforces 732D [二分 ][贪心]
- CodeForces - 853A Planning(贪心)
- CodeForces 698A —Vacations(贪心)
- Codeforces 854C. Planning 贪心
- CodeForces - 731C Socks(并查集)(贪心)
- Codeforces 461A Appleman and Toastman(贪心)
- 【贪心】【codeforces】651A Joysticks
- Codeforces - 478C. Table Decorations - 思维、贪心
- Codeforces 659D Bicycle Race【计算几何】
- CodeForces 377B-Preparing for the Contest(二分+贪心)
- Codeforces 499C:Crazy Town(计算几何)
- codeforces-140【A几何】【精度】
- codeforces_600C. Make Palindrome(贪心)
- Codeforces 521A DNA Alignment【贪心+思维】