p2413.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 129 行

CPP
129
字号
// This is a Dp program
// time         2005//04//17

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

#define   MAX   1e10;

int     n;
struct  num {
        double     x,y;
}       pos[200];
int     minnum[200];

double   ans[200][2];


void Readin();
double   Work();
bool    comp1(const num & a, const num & b);
double maxone  (double a,double b);
double minone  (double a,double b);
double   dis(double a,double b,double c,double d);

double dis(double a,double b,double c, double d)
{
return sqrt( (a-b) * (a-b) + (c-d) * (c-d));
}


double maxone(double a ,double b)
{
return a>b?a:b;
}

double minone(double a, double b)
{
return a<b?a:b;
}


bool comp1(const num & a , const  num & b)
{
return a.y<b.y;
}


double Work()
{
int     i,j;
float   min,up,down;




/*for (i=0;i<n;i++) {
        cout<<pos[i].x<<' '<<pos[i].y<<endl;
} */

sort(pos , pos + n, comp1);

ans[0][0]=ans[0][1]=MAX;

/*cout<<"here are the position:"<<endl;

for (i=0;i<n;i++) {
        cout<<pos[i].x<<' '<<pos[i].y<<endl;
} */



for (i=1;i<n;i++) {
        min=MAX;
        for (j=0;j<i;j++)
                if ( sqrt((pos[i].x-pos[j].x)* (pos[i].x - pos[j].x)
                + (pos[i].y-pos[j].y) * (pos[i].y-pos[j].y))<min) {
                min=sqrt((pos[i].x-pos[j].x) * (pos[i].x - pos[j].x)
                + (pos[i].y-pos[j].y) * (pos[i].y-pos[j].y));
                minnum[i]=j;
                }
}

for (i=1;i<n;i++) {
        up=dis (pos[i].x,pos[i-1].x,pos[i].y,pos[i-1].y);
        up=minone(up,ans[i-1][0]);
        if (i-1!=minnum[i]) up=minone(up,dis(pos[i].x,pos[minnum[i]].x,pos[i].y-1,pos[minnum[i]].y-1));
        down= dis (pos[i].x,pos[i-1].x,pos[i].y-1,pos[i-1].y+1);
        down=minone(down,ans[i-1][1]);
        if (i-1!=minnum[i]) down=minone(down,dis(pos[i].x,pos[minnum[i]].x,pos[i].y-1,pos[minnum[i]].y-1));
        ans[i][0] = maxone (up,down);

        up=dis(pos[i].x,pos[i-1].x,pos[i].y,pos[i-1].y);
        up=minone(up,ans[i-1][1]);
        if (i-1!=minnum[i]) up=minone(up,dis(pos[i].x,pos[minnum[i]].x,pos[i].y+1,pos[minnum[i]].y-1));
        down= dis (pos[i].x,pos[i-1].x,pos[i].y+1,pos[i-1].y-1);
        down=minone (down ,ans[i-1][0]);
        if (i-1!=minnum[i]) down=minone (down ,dis(pos[i].x,pos[minnum[i]].x,pos[i].y+1,pos[minnum[i]].y-1));
        ans[i][1] = maxone (up,down);
}


if (ans[n-1][0]>ans[n-1][1]) return ans[n-1][0];
        else return ans[n-1][1];

}


// input 
void Readin()
{
int i;
cin>>n;
if (n==0) exit(0);
for (i=0;i<n;i++) cin>>pos[i].x>>pos[i].y;
}

main()
{
cout.precision(3);
cout.setf(ios::fixed);
while (1) {
        Readin();
        cout<<Work()<<endl;
}
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?