Recycling Bottles

Recycling Bottles
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

It was recycling day in Kekoland. To celebrate it Adil and Bera went to Central Perk where they can take bottles from the ground and put them into a recycling bin.

We can think Central Perk as coordinate plane. There are n bottles on the ground, the i-th bottle is located at position (xi, yi). Both Adil and Bera can carry only one bottle at once each.

For both Adil and Bera the process looks as follows:

  1. Choose to stop or to continue to collect bottles.
  2. If the choice was to continue then choose some bottle and walk towards it.
  3. Pick this bottle and walk to the recycling bin.
  4. Go to step 1.

Adil and Bera may move independently. They are allowed to pick bottles simultaneously, all bottles may be picked by any of the two, it's allowed that one of them stays still while the other one continues to pick bottles.

They want to organize the process such that the total distance they walk (the sum of distance walked by Adil and distance walked by Bera) is minimum possible. Of course, at the end all bottles should lie in the recycling bin.

Input

First line of the input contains six integers axaybxbytx and ty (0 ≤ ax, ay, bx, by, tx, ty ≤ 109) — initial positions of Adil, Bera and recycling bin respectively.

The second line contains a single integer n (1 ≤ n ≤ 100 000) — the number of bottles on the ground.

Then follow n lines, each of them contains two integers xi and yi (0 ≤ xi, yi ≤ 109) — position of the i-th bottle.

It's guaranteed that positions of Adil, Bera, recycling bin and all bottles are distinct.

Output

Print one real number — the minimum possible total distance Adil and Bera need to walk in order to put all bottles into recycling bin. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct if .

Examples
input
3 1 1 2 0 0
3
1 1
2 1
2 3
output
11.084259940083
input
5 0 4 2 2 0
5
5 2
3 0
5 5
3 5
3 3
output
33.121375178000
Note

Consider the first sample.

Adil will use the following path: .

Bera will use the following path: .

Adil's path will be  units long, while Bera's path will be  units long.


題意:給定2個人的座標和垃圾桶的座標,以及N的垃圾的座標,問將所以垃圾放到垃圾桶的距離和最小是多少。可以一個人不撿。

題解:當A和B都到垃圾桶時,誰去撿都是一樣的,來回都是垃圾到垃圾桶的距離,我們要考慮的是A去撿的第一個垃圾以及B去撿的第一個垃圾。

我們用dis[0][i]表示A的初始位置到第i個垃圾的距離,dis[1][i]表示B的初始位置到第i個垃圾的距離,dis[2][i]表示垃圾桶到第i個垃圾的位置。

我們可以先把從垃圾桶出發的距離和tot = sum(dis[2][1]....dis[2][n])

這樣,如果A去撿第i個垃圾,那麼就可以在tot的基礎上減少一次dis[2][i]但是要增加一次dis[0][i],然後B去撿第j(j!=i)個垃圾,可以再減少一次dis[2][j]然後增加一次dis[1][j].當然此時B可以不去撿垃圾。

然後我們再反的來一次,讓B先去撿,考慮A撿哪個,或者不撿,比較兩次花費時間即可。


#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
#if defined(_MSC_VER) || __cplusplus > 199711L
#define aut(r,v) auto r = (v)
#else
#define aut(r,v) __typeof(v) r = (v)
#endif
#define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it)
#define fur(i,a,b) for(int i=(a);i<=(b);i++)
#define furr(i,a,b) for(int i=(a);i>=(b);i--)
#define cl(a) memset((a),0,sizeof(a))
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define sc(x) scanf("%d",&x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const int mod=1000000007;
const double pi=acos(-1);
inline void gn(long long&x){
    int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-');c=='-'?(sg=-1,x=0):(x=c-'0');
    while((c=getchar())>='0'&&c<='9')x=x*10+c-'0';x*=sg;
}
inline void gn(int&x){long long t;gn(t);x=t;}
inline void gn(unsigned long long&x){long long t;gn(t);x=t;}
inline void gn(double&x){double t;scanf("%lf",&t);x=t;}
inline void gn(long double&x){double t;scanf("%lf",&t);x=t;}
int gcd(int a,int b){return a? gcd(b%a,a):b;}
ll powmod(ll a,ll x,ll mod){ll t=1ll;while(x){if(x&1)t=t*a%mod;a=a*a%mod;x>>=1;}return t;}
struct Node{
	int x,y;
}pa,pb,p,tmp;
double	getdis(Node a,Node b){
	return sqrt((a.x-b.x)*1.0*(a.x-b.x)+(a.y-b.y)*1.0*(a.y-b.y));
}
double dis[3][1000005];
int main(){
	//freopen("E:\\data.in","r",stdin);
	gn(pa.x);gn(pa.y);gn(pb.x);gn(pb.y);gn(p.x);gn(p.y);
	int n;
	dis[0][0] = dis [1][0] = dis[2][0] = 0;
	double tot = 0;
	gn(n);
	fur(i,1,n){
		gn(tmp.x);gn(tmp.y);
		dis[0][i] = getdis(tmp,pa);
		dis[1][i] = getdis(tmp,pb);
		dis[2][i] = getdis(tmp,p);
		tot+=(dis[2][i]*2);
	}
	
	
	double add1 = 1e18;
	int id = 0;
	fur(i,1,n)
		if(dis[0][i]-dis[2][i]<add1){
			add1 = dis[0][i]-dis[2][i];
			id = i;
		}
	double add2 = dis[1][0]-dis[2][0];
	fur(i,1,n)
		if(i == id)continue;	//兩人第一個撿的不能相同 
		else if(dis[1][i]-dis[2][i]<add2)
			add2 = dis[1][i]-dis[2][i];
	
	double plus = add1+add2;

	add1 = 1e18;
	id = 0;
	fur(i,1,n)
		if(dis[1][i]-dis[2][i]<add1){
			add1 = dis[1][i]-dis[2][i];
			id = i;
		}
	add2 = dis[0][0]-dis[2][0];
	fur(i,0,n)
		if(i == id)continue;
		else if(dis[0][i]-dis[2][i]<add2)
			add2 = dis[0][i]-dis[2][i];


	if(add1+add2<plus)
		plus = add1+add2;
		
	printf("%lf\n",tot+plus);
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章