Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2177 | Accepted: 1374 |
Description
In order to catch fish, he began to make a kind of fishnet by cutting the long thread into short threads and fixing them at pegs on the square wood-frame. He wanted to know the sizes of the meshes of the fishnet to see whether he could catch small fish as well as large ones.
The wood frame is perfectly square with four thin edges on meter long: a bottom edge, a top edge, a left edge, and a right edge. There are n pegs on each edge, and thus there are 4n pegs in total. The positions of pegs are represented by their (x,y)-coordinates. Those of an example case with n=2 are depicted in figures below. The position of the ith peg on the bottom edge is represented by (ai,0). That on the top edge, on the left edge and on the right edge are represented by (bi,1), (0,ci) and (1,di), respectively. The long thread is cut into 2n threads with appropriate lengths. The threads are strained between (ai,0) and (bi,1),and between (0,ci) and (1,di) (i=1,...,n).
You should write a program that reports the size of the largest mesh among the (n+1)2 meshes of the fishnet made by fixing the threads at the pegs. You may assume that the thread he found is long enough to make the fishnet and the wood-frame is thin enough for neglecting its thickness.
Input
n
a1 a2 ... an
b1 b2 ... bn
c1 c2 ... cn
d1 d2 ... dn
you may assume 0 < n <= 30, 0 < ai,bi,ci,di < 1
Output
Sample Input
2 0.2000000 0.6000000 0.3000000 0.8000000 0.1000000 0.5000000 0.5000000 0.6000000 2 0.3333330 0.6666670 0.3333330 0.6666670 0.3333330 0.6666670 0.3333330 0.6666670 4 0.2000000 0.4000000 0.6000000 0.8000000 0.1000000 0.5000000 0.6000000 0.9000000 0.2000000 0.4000000 0.6000000 0.8000000 0.1000000 0.5000000 0.6000000 0.9000000 2 0.5138701 0.9476283 0.1717362 0.1757412 0.3086521 0.7022313 0.2264312 0.5345343 1 0.4000000 0.6000000 0.3000000 0.5000000 0
Sample Output
0.215657 0.111112 0.078923 0.279223 0.348958
Source
題意:在一個 1*1的正方體中,給出四個邊上的點,相對應的點相連線,在這些連線當中,求面積最大的一個區域。
看代碼
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
struct node
{
double x,y;
}p[35][35];
node qiudian(node a,node b,node c,node d) //通過相對應的點求交點
{
node tep=a;
double t=((a.x-c.x)*(c.y-d.y)-(a.y-c.y)*(c.x-d.x))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x));
//printf("%lf\n",t);
tep.x+=(b.x-a.x)*t;
tep.y+=(b.y-a.y)*t;
//printf("%.6lf %.6lf \n",tep.x,tep.y);
return tep;
}
double mianji(node a,node b,node c) //通過叉積求面積
{
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
void init(int n)
{
p[0][0].x =0;
p[0][0].y =0.0;
p[0][n+1].x=1.0;
p[0][n+1].y=0.0;
p[n+1][0].x=0.0;
p[n+1][0].y=1.0;
p[n+1][n+1].x=1.0;
p[n+1][n+1].y=1.0;
}
int main()
{
int n,m,i,j;
while(scanf("%d",&n)&&n)
{
init(n);
for(i=1;i<=n;i++)
{
scanf("%lf",&p[0][i].x);
p[0][i].y=0.0;
}
for(i=1;i<=n;i++)
{
scanf("%lf",&p[n+1][i].x);
p[n+1][i].y=1.0;
}
for(i=1;i<=n;i++)
{
scanf("%lf",&p[i][0].y);
p[i][n+1].x=0.0;
}
for(i=1;i<=n;i++)
{
scanf("%lf",&p[i][n+1].y);
p[i][n+1].x=1.0;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
p[i][j]=qiudian(p[0][j],p[n+1][j],p[i][0],p[i][n+1]);
}
}
double maxx=-1000000.00;
for(i=1;i<=n+1;i++)
{
for(j=1;j<=n+1;j++)
{
double temp=fabs(mianji(p[i-1][j-1],p[i][j],p[i][j-1]));
temp+=fabs(mianji(p[i-1][j-1],p[i][j],p[i-1][j]));
temp/=2;
if(maxx<temp)
maxx=temp;
}
}
printf("%.6f\n",maxx);
}
return 0;
}