用二分花了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|1
typedef 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|1
typedef 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;
}