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;}


原创粉丝点击