Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

求高人指点,怎么老是错呢?

Posted by acpigs at 2008-09-08 15:30:45 on Problem 1379
我的想法是假如最安全的点是A,那么所有点到他的最短距离最长,如是,我们作圆,
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int X=0,Y=0,m=0;
int p[1001][2]={{0}};
double point[3][2] = {{0}};
double compute(),binary(double i,double j);
int check(int i,double R2),contact(int i,int j,double R);
int main()
{
    int i = 0,j = 0,testcases = 0;
    scanf("%d",&testcases);
    for (i=1;i<=testcases;i++)
    {
        scanf("%d%d%d",&X,&Y,&m);
        for (j=1;j<=m;j++)
        {
            scanf("%d%d",&p[j][0],&p[j][1]);
            if (p[j][0]>X||p[j][1]>Y)
            {
                j--,m--;
            }
        }
        compute();
        printf("The safest point is (%0.1lf, %0.1lf).\n",point[2][0],point[2][1]);
    }
    return 0;
}
double compute()
{
    if (m != 1)
    {
        int i,j,pppppoint[4][2] = {{0,0},{0,Y},{X,Y},{X,0}};
        double R2 = 0,minR2=X*X+Y*Y,realR2;
        for (j=0;j<=3;j++)
        {
            minR2=X*X+Y*Y;
            for (i=1;i<=m;i++)
            {
                realR2 = (pppppoint[j][0]-p[i][0])*(pppppoint[j][0]-p[i][0])
                         + (pppppoint[j][1]-p[i][1])*(pppppoint[j][1]-p[i][1]);
                if (minR2>realR2)minR2 = realR2;
            }
            if (minR2>R2)
            {
                R2 = minR2;
                point[2][0]=pppppoint[j][0],point[2][1]=pppppoint[j][1];
            }
        }
        return binary(sqrt(R2),sqrt(1.0*X*X+Y*Y));
    }
    else
    {
        if (fabs(p[1][0])>fabs(p[1][0]-X))point[2][0] = 0;
        else point[2][0] = X;
        if ( fabs(p[1][1])>fabs(p[1][1]-Y))point[2][1] = 0;
        else point[2][1] = Y;
        return 0;
    }
}
int contact(int i,int j,double R)
{
    double a,b,l2,x1,y1,r2,c;
    a = 1.0 * (p[i][0] - p[j][0]);
    b = 1.0 * (p[i][1] - p[j][1]);
    l2= a*a + b*b;
    x1 = 0.5 * (p[i][0] + p[j][0]);
    y1 = 0.5 * (p[i][1] + p[j][1]);
    r2 = R*R - l2 / 4.0;

    if (r2 < -0.001 )return 0;
    (r2>0)?(c = sqrt ((r2) / l2)):( c = 0);
    point[0][0] = x1 + b*c;
    point[0][1] = y1 - a*c;
    point[1][0] = x1 - b*c;
    point[1][1] = y1 + a*c;
    return 1;
}
double binary(double i,double j)
{
    double k = 0.5*(i+j);
    int a=0,b=0;
    if (j-i<=0.04)return k;
    for (a=1;a<m;a++)
        for (b=a+1;b<=m;b++)
        {
            if (((p[a][0]-p[b][0])||(p[a][1]-p[b][1]))&&contact(a,b,k))
            {
                if (check(1,k*k)||check(0,k*k))
                    return binary(k,j);
            }
        }
    return binary(i,k);
}
int check(int i,double R2)
{
    int j;
    if ( point[i][0]>X||point[i][0]<0
            || point[i][1]>Y||point[i][1]<0)
        return 0;
    double k = 0;
    for (j=1;j<=m;j++)
    {
        k = (pow(point[i][0]-p[j][0],2)+pow(point[i][1]-p[j][1],2));
        if (k < R2-0.001 )
            return 0;
    }
    point[2][0] = point[i][0],point[2][1] = point[i][1];
    return 1;
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator