POJ
来源:互联网 发布:福建网络广播电视台:{ 编辑:程序博客网 时间:2024/06/15 09:47
题目链接点这里
用二分花了2000 ms,
迭代花了300ms,,太强了
分数规划的内容这篇博客不错:
[Algorithm]01分数规划——Update:2012年7月27日
二分:
#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>#include<map>#include<set>#include<bitset>#include<stack>#include<queue>#include<string.h>#include<cstring>#include<vector>#include<time.h>#include<stdlib.h>using namespace std;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3f#define FIN freopen("input.txt","r",stdin)#define mem(x,y) memset(x,y,sizeof(x))typedef unsigned long long ULL;typedef long long LL;#define fuck(x) cout<<"x"<<endl;#define MX 111111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef pair<pair<int,int>,int> PIII;typedef pair<int,int> PII;const double eps=1e-6;int n;struct Nod{ double x,y,z;} w[MX];double mincost[MX];bool is[MX];double prim(double k){ for(int i=1; i<=n; i++)mincost[i]=INF,is[i]=0; mincost[1]=0; double ans=0; for(int i=1; i<=n; i++) { int x; double minn=INF; for(int i=1; i<=n; i++) if(is[i]==0&&mincost[i]<minn)minn=mincost[i],x=i; ans+=minn; is[x]=1; for(int i=1; i<=n; i++) if(is[i]==0) mincost[i]=min(mincost[i],fabs(w[x].z-w[i].z)-k*sqrt((w[x].x-w[i].x)*(w[x].x-w[i].x)+(w[x].y-w[i].y)*(w[x].y-w[i].y))); } return ans;}int main(){ while(cin>>n&&n) { double l=0,r=0; for(int i=1; i<=n; i++) { scanf("%lf%lf%lf",&w[i].x,&w[i].y,&w[i].z); r=max(r,w[i].z); } //int t=50; while(fabs(l-r)>eps) { double mid=(l+r)/2; if(prim(mid)<0) r=mid; else l=mid; } printf("%.3f\n",l); } return 0;}
迭代:
#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>#include<map>#include<set>#include<bitset>#include<stack>#include<queue>#include<string.h>#include<cstring>#include<vector>#include<time.h>#include<stdlib.h>using namespace std;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3f#define FIN freopen("input.txt","r",stdin)#define mem(x,y) memset(x,y,sizeof(x))typedef unsigned long long ULL;typedef long long LL;#define fuck(x) cout<<"x"<<endl;#define MX 111111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef pair<pair<int,int>,int> PIII;typedef pair<int,int> PII;const double eps=1e-5;int n;struct Nod{ double x,y,z;} w[MX];double mincost[MX],mindist[MX],minheight[MX];bool is[MX];double prim(double k){ for(int i=1; i<=n; i++)mincost[i]=INF,is[i]=0; mincost[1]=mindist[1]=minheight[1]=0; double cost=0,dist=0; for(int i=1; i<=n; i++) { int x; double minn=INF; for(int i=1; i<=n; i++) if(is[i]==0&&mincost[i]<minn)minn=mincost[i],x=i; cost+=minheight[x]; dist+=mindist[x]; is[x]=1; for(int i=1; i<=n; i++) if(is[i]==0) { double c=fabs(w[x].z-w[i].z),d=sqrt((w[x].x-w[i].x)*(w[x].x-w[i].x)+(w[x].y-w[i].y)*(w[x].y-w[i].y)); if(mincost[i]>c-k*d) { mincost[i]=c-k*d; mindist[i]=d; minheight[i]=c; } } } return cost/dist;}int main(){ FIN; while(cin>>n&&n) { double maxn=0; for(int i=1; i<=n; i++) { scanf("%lf%lf%lf",&w[i].x,&w[i].y,&w[i].z); maxn=max(maxn,w[i].z); } double ans=prim(maxn),pre=0; while(fabs(ans-pre)>eps) { double t=ans; ans=prim(ans); pre=t; } printf("%.3f\n",ans); } return 0;}