| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
给写测试数据呀,大牛们,无限感谢!!wa//5 -1 -1 4 3 1 1 0 3 4 0
#include<stdio.h>
#include<math.h>
#include<Limits.h>
typedef struct
{
int x;
int y;
}POINT;
POINT point[50001],a[50001],b[2], *temp, source, small;
int k;
void Find(int n)
{
int i, mult;
temp = &point[0];
for(i=1; i<n; i++)
{
if(point[i].y < temp->y || (point[i].y==temp->y && point[i].x<temp->x))
temp = &point[i];
}
return;
}
int Mult(POINT a, POINT b)
{
return (a.x*b.y - b.x*a.y);
}
double Dis(POINT k)
{
return sqrt((k.x)*(k.x)+(k.y)*(k.y));
}
int MultBigger(POINT a, POINT b, POINT c)
{
POINT p, q;
p.x = b.x-a.x;
p.y = b.y-a.y;
q.x = c.x-b.x;
q.y = c.y-b.y;
if(Mult(p,q) < 0) return 1; /*叉积运算*/
else if(Mult(p,q) > 0) return 0;
else
{
if(Dis(q) > Dis(p)) return 1;
else return 0;
}
}
int Search(int n)
{
int i;
POINT temper;
temper = source;
for(i=0; i<n; i++)
{
if(point[i].x ==INT_MAX)//已检查过的点
continue;
if (MultBigger(source, temper, point[i]))
{
temp = &point[i];
temper = point[i];
}
}
if(MultBigger(source, temper, small)) return 1;
a[k].x=temp->x;a[k].y=temp->y;k++;
source = *temp;
temp->x = INT_MAX;
return 0;
}
int main()
{
int n, i, c,j,m,D,D1,D2;
double x1,y1,x2,y2,x3,y3,x4,y4;
double min,max;
while(scanf("%d%d",&n,&c)!=EOF)
{
for(i=0; i<n; i++)
scanf("%d", &point[i].x);
for(i=0;i<n;i++)
scanf("%d",&point[i].y);
if(n==1)
{printf("%d.000 %d.000\n",point[0].y,point[0].y);continue;}
if(n==2)
{
D=point[1].x-point[0].x;D1=point[1].x-c;D2=c-point[0].x;
x1=D1/(double)D;x2=D2/(double)D2;
if(D!=0)
min=max=point[0].y*x1+point[1].y*x2;
else
{
if(point[0].y>point[1].y){max=point[0].y;min=point[1].y;}
else {max=point[1].y;min=point[0].y;}
}
printf("%.3lf %.3lf\n",min,max);continue;
}
Find(n); /*找出最下、最右点*/
source = *temp;
small = *temp;
k=0;
k++;
a[k].x=small.x;a[k].y=small.y;k++;
temp->x =INT_MAX;
for(i=0; i<n; i++)
if(Search(n)) break; /*按叉积搜索 break 时回到出发点*/
m=0;
for(i=1;i<k;i++)
{
if(c==a[i].x)
{
m++;b[m].x=a[i].x;b[m].y=a[i].y;
m++;b[m].x=a[i+1].x;b[m].y=a[i+1].y;
}
else if(c>a[i].x&&c<a[i+1].x||c>a[i+1].x&&c<a[i].x)
{
m++;b[m].x=a[i].x;b[m].y=a[i].y;
m++;b[m].x=a[i+1].x;b[m].y=a[i+1].y;
}
}
for(i=1;i<=4;i++)
printf("%d %d\n",b[i].x,b[i].y);
x1=b[2].x-b[1].x;y1=b[2].y-b[1].y;
x2=c-b[1].x;
min=(x2*y1)/(double)x1+b[1].y;
x3=b[4].x-b[3].x;y3=b[4].y-b[3].y;
x2=c-b[3].x;
max=(x2*y3)/(double)x3+b[3].y;
printf("%.3lf %.3lf\n",min,max);
}
}//main
/*
3 1
0 2 1
0 0 1
5 2
-1 4 1 0 4
-1 3 1 3 0
*/
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator