codeforces 671A

题意:给你两个人的位置和一个箱子的位置,然后给出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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值