标签:amp class chm single ext contain mat pac and
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1037 Accepted Submission(s): 349
题目大意:把动点固定最少需要多长的木棒。
题解:状态压缩+dp
#include <iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; double inf=100000000000.0; double dis[300000]; int n; int start,target; struct node { double x,y; bool fix; }p[20]; double cal(int a,int b) { return sqrt((double)((p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y))); } double work(int k,int t) { double dis[20]; int l=0; for(int i=0;i<n;i++) if (k&(1<<i)) dis[l++]=cal(i,t); //判断第i个点是否固定 if (l<2) return -1; sort(dis,dis+l);//sort的第一个参数首地址,第二个参数尾地址,排序范围为“[,)” return dis[0]+dis[1]; } int main() { while(~scanf("%d",&n)) { if (n==0) break; start=0; target=0; for(int i=0;i<n;i++) { scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].fix); start=start|(p[i].fix<<i); target=target|(1<<i); } for(int i=0;i<=target;i++) dis[i]=inf; dis[start]=0; for(int k=start;k<=target;k++) {
//if (dis[k]==inf) continue; 这句最好加上 for(int i=0;i<n;i++) if ( !(k&(1<<i)) )//判断第i个点是否可以移动,如果可以继续做 { double res=work(k,i); if(res>0) dis[k|(1<<i)]=min(dis[k|(1<<i)],dis[k]+res); } } if (dis[target]==inf) printf("No Solution\n"); else printf("%.6lf\n",dis[target]); } return 0; }
标签:amp class chm single ext contain mat pac and
原文地址:http://www.cnblogs.com/stepping/p/6289225.html