题目链接:
题目大意:你在一个位置用激光枪灭敌人,给你初始位置,下面是2*n个敌人的位置,你一枪能杀两个,可以杀死任意两个人,激光束的路径是消耗的能量,求最小能量,保证一次只消灭两个敌人,你的位置不变
Sample Input
2
0 0
1
6 0
3 0
0 0
2
1 0
2 1
-1 0
-2 0
Sample Output
Case #1: 6.00
Case #2: 4.41
分析:给每个点编个号,用状态压缩表示射击那些点,射击过的表示为1,dp[i]表示射击状态 i 时最少消耗,答案即为dp[(1<<2*n)-1]
先每个点到射击点排个序,每次选最近的一个点,和距离这个点最近的点,这两个就是应该选的点(贪心)
代码如下:
1 # include2 # include 3 # include 4 # include 5 # include 6 using namespace std; 7 const int INF = 0xffffff; 8 double dis[21][21],dp[1<<21]; 9 int vis[1<<21];10 int n,fx,fy;11 struct NODE12 {13 int x,y;14 } node[21];15 double DIS(double x1,double y1,double x2,double y2)16 {17 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));18 }19 bool cmp(NODE a,NODE b)20 {21 return DIS(a.x,a.y,fx,fy)