#会津大学オンラインジャッジ問1089 Strawberry Cake合格堀江伸一
def g(x1,y1,x2,y2)
return x1*y2-y1*x2
end
def lenCheck(x,y)
dx=((x.negative?)?-1:1)*0.00000001
dy=((y.negative?)?-1:1)*0.00000001
add=0
while x*x+y*y<1.0 && add<100
x+=dx
y+=dy
add+=1
end
return [x,y]
end
def searchP(x1,y1,xs,ys,n)
res=0
n.times{|i|
p1=i
p2=(i+1)%n
if 0<=g(xs[p1],ys[p1],-x1,-y1) && 0<=g(-x1,-y1,xs[p2],ys[p2]) then
res=i
break
end
}
return res
end
def calcAllS(xs,ys,n)
ans=0.0
n.times{|i|
x1=xs[i]
y1=ys[i]
x2=xs[(i+1)%n]
y2=ys[(i+1)%n]
ans+=g(x1,y1,x2,y2)
}
return (ans/2.0).abs
end
def calcCross(n,p1,bx,by,xs,ys)
p2=(p1+1)%n
dx=xs[p2]-xs[p1]
dy=ys[p2]-ys[p1]
ax=xs[p1]
ay=ys[p1]
t=(by*ax-bx*ay)/(bx*dy-dx*by)
rx=ax+t*dx
ry=ay+t*dy
return [rx,ry]
end
def calcS(deep,n,p1,r1,r2,xs,ys,add)
r3=(r1+r2)/2.0
r1a=r3+add
bx=xs[p1]*(1.0-r1a)+xs[(p1+1)%n]*r1a
by=ys[p1]*(1.0-r1a)+ys[(p1+1)%n]*r1a
p2=searchP(bx,by,xs,ys,n)
ax=xs[p2]
ay=ys[p2]
dx=xs[(p2+1)%n]-xs[p2]
dy=ys[(p2+1)%n]-ys[p2]
xy=calcCross(n,p2,bx,by,xs,ys)
areaXs=[]
areaYs=[]
p1a=[p1,p2].min
p2a=[p1,p2].max
#n.times{|i|
# if p1a<i && i<=p2a then
# areaXs<<xs[i]
# areaYs<<ys[i]
# end
#}
s0=$memo[p2a]-$memo[(p1a+1)%n]
s1=0.0
if p1<p2 then
#areaXs<<bx
#areaYs<<by
#areaXs<<xs[(p1a+1)%n]
#areaYs<<ys[(p1a+1)%n]
#areaXs<<xs[p2a]
#areaYs<<ys[p2a]
#areaXs<<xy[0]
#areaYs<<xy[1]
s1=g(bx,by,xs[(p1a+1)%n],ys[(p1a+1)%n])
s1+=g(xs[p2a],ys[p2a],xy[0],xy[1])
s1+=g(xy[0],xy[1],bx,by)
else
s1=g(xy[0],xy[1],xs[(p1a+1)%n],ys[(p1a+1)%n])
s1+=g(xs[p2a],ys[p2a],bx,by)
s1+=g(bx,by,xy[0],xy[1])
end
s1/=2.0
#p [bx,by,xy[0],xy[1]]
areaS=s1+s0
#p ["s",areaS,areaS*2] if(deep==32)
return areaS
end
def searchB(deep,n,p1,r1,r2,xs,ys,allS)
r3=(r1+r2)/2.0
rx0=xs[p1]*(1.0-r3)+xs[(p1+1)%n]*r3
ry0=ys[p1]*(1.0-r3)+ys[(p1+1)%n]*r3
b1=false
b1=true if rx0==xs[p1] && ry0==ys[p1]
b1=true if rx0==xs[(p1+1)%n] && ry0==ys[(p1+1)%n]
if 29<deep || b1==true then
#rx0=xs[p1]*(1.0-r3)+xs[(p1+1)%n]*r3
#ry0=ys[p1]*(1.0-r3)+ys[(p1+1)%n]*r3
rxy0=lenCheck(rx0,ry0)
rx=rxy0[0]
ry=rxy0[1]
s0=calcS(deep,n,p1,r3,r3,xs,ys,0.0)
rd=(allS-s0*2).abs
return [rd,rx,ry]
else
s1=calcS(deep,n,p1,r1,r2,xs,ys,0.0)
d1=(s1*2-allS).abs
s2=calcS(deep,n,p1,r1,r2,xs,ys,0.0000000001)
d2=(s2*2-allS).abs
if d1<d2 then
return searchB(deep+1,n,p1,r1,r3,xs,ys,allS)
else
return searchB(deep+1,n,p1,r3,r2,xs,ys,allS)
end
end
end
def f(n)
xs=[]
ys=[]
xs0=[]
ys0=[]
n.times{
x,y=gets.split(" ").map{|e| e.to_f}
xs<<x
ys<<y
xs0<<x
ys0<<y
}
allS=calcAllS(xs,ys,n)
xs0.size.times{|p1|
n=xs.size
bx=xs0[p1]
by=ys0[p1]
p2=searchP(bx,by,xs,ys,n)
ax=xs[p2]
ay=ys[p2]
dx=xs[(p2+1)%n]-xs[p2]
dy=ys[(p2+1)%n]-ys[p2]
xy=calcCross(n,p2,bx,by,xs,ys)
xs.insert(p2+1,xy[0])
ys.insert(p2+1,xy[1])
}
n=xs.size
$memo=[0.0]
memos=0.0
n.times{|p1|
p2=(p1+1)%n
memos+=g(xs[p1],ys[p1],xs[p2],ys[p2])/2.0
$memo<<memos
}
allAns=[]
n.times{|i|
p1=i
p2=(i+1)%n
allAns<<searchB(0,n,p1,0.0,1.0,xs,ys,allS)
}
allAns.select!{|e|
(e[0].nan?)?false:true
}
e1=allAns.min
#p e1[0]
puts sprintf("%0.15f %0.15f",e1[1],e1[2])
end
n=1
while n>0
n=gets.to_i
break if n==0
f(n)
end
I+S8mua0peWkp+WtpuOCquODs+ODqeOCpOODs+OCuOODo+ODg+OCuOWVjzEwODkgU3RyYXdiZXJyeSBDYWtl5ZCI5qC85aCA5rGf5Ly45LiACmRlZiBnKHgxLHkxLHgyLHkyKQoJcmV0dXJuIHgxKnkyLXkxKngyCmVuZAoKZGVmIGxlbkNoZWNrKHgseSkKCWR4PSgoeC5uZWdhdGl2ZT8pPy0xOjEpKjAuMDAwMDAwMDEKCWR5PSgoeS5uZWdhdGl2ZT8pPy0xOjEpKjAuMDAwMDAwMDEKCWFkZD0wCgl3aGlsZSB4KngreSp5PDEuMCAmJiBhZGQ8MTAwCgkJeCs9ZHgKCQl5Kz1keQoJCWFkZCs9MQoJZW5kCgkKCXJldHVybiBbeCx5XQplbmQKCmRlZiBzZWFyY2hQKHgxLHkxLHhzLHlzLG4pCglyZXM9MAoJbi50aW1lc3t8aXwKCQlwMT1pCgkJcDI9KGkrMSklbgoJCWlmIDA8PWcoeHNbcDFdLHlzW3AxXSwteDEsLXkxKSAmJiAwPD1nKC14MSwteTEseHNbcDJdLHlzW3AyXSkgdGhlbgoJCQlyZXM9aQoJCQlicmVhawkKCQllbmQKCX0KCXJldHVybiByZXMKZW5kCgpkZWYgY2FsY0FsbFMoeHMseXMsbikKCWFucz0wLjAKCW4udGltZXN7fGl8CgkJeDE9eHNbaV0KCQl5MT15c1tpXQoJCXgyPXhzWyhpKzEpJW5dCgkJeTI9eXNbKGkrMSklbl0KCQlhbnMrPWcoeDEseTEseDIseTIpCgl9CglyZXR1cm4gKGFucy8yLjApLmFicwplbmQKCmRlZiBjYWxjQ3Jvc3MobixwMSxieCxieSx4cyx5cykKCXAyPShwMSsxKSVuCglkeD14c1twMl0teHNbcDFdCglkeT15c1twMl0teXNbcDFdCglheD14c1twMV0KCWF5PXlzW3AxXQoJdD0oYnkqYXgtYngqYXkpLyhieCpkeS1keCpieSkKCXJ4PWF4K3QqZHgKCXJ5PWF5K3QqZHkKCXJldHVybiBbcngscnldCmVuZAoKZGVmIGNhbGNTKGRlZXAsbixwMSxyMSxyMix4cyx5cyxhZGQpCglyMz0ocjErcjIpLzIuMAoJcjFhPXIzK2FkZAoJCglieD14c1twMV0qKDEuMC1yMWEpK3hzWyhwMSsxKSVuXSpyMWEKCWJ5PXlzW3AxXSooMS4wLXIxYSkreXNbKHAxKzEpJW5dKnIxYQoJcDI9c2VhcmNoUChieCxieSx4cyx5cyxuKQoKCWF4PXhzW3AyXQoJYXk9eXNbcDJdCglkeD14c1socDIrMSklbl0teHNbcDJdCglkeT15c1socDIrMSklbl0teXNbcDJdCgl4eT1jYWxjQ3Jvc3MobixwMixieCxieSx4cyx5cykKCWFyZWFYcz1bXQoJYXJlYVlzPVtdCglwMWE9W3AxLHAyXS5taW4KCXAyYT1bcDEscDJdLm1heAoJCgkjbi50aW1lc3t8aXwKCSMJaWYgcDFhPGkgJiYgaTw9cDJhIHRoZW4KCSMJCWFyZWFYczw8eHNbaV0KCSMJCWFyZWFZczw8eXNbaV0KCSMJZW5kCgkjfQoJczA9JG1lbW9bcDJhXS0kbWVtb1socDFhKzEpJW5dCglzMT0wLjAKCWlmIHAxPHAyIHRoZW4KCQkjYXJlYVhzPDxieAoJCSNhcmVhWXM8PGJ5CgkJI2FyZWFYczw8eHNbKHAxYSsxKSVuXQoJCSNhcmVhWXM8PHlzWyhwMWErMSklbl0KCQkjYXJlYVhzPDx4c1twMmFdCgkJI2FyZWFZczw8eXNbcDJhXQoJCSNhcmVhWHM8PHh5WzBdCgkJI2FyZWFZczw8eHlbMV0KCQlzMT1nKGJ4LGJ5LHhzWyhwMWErMSklbl0seXNbKHAxYSsxKSVuXSkKCQlzMSs9Zyh4c1twMmFdLHlzW3AyYV0seHlbMF0seHlbMV0pCgkJczErPWcoeHlbMF0seHlbMV0sYngsYnkpCgllbHNlCgkJczE9Zyh4eVswXSx4eVsxXSx4c1socDFhKzEpJW5dLHlzWyhwMWErMSklbl0pCgkJczErPWcoeHNbcDJhXSx5c1twMmFdLGJ4LGJ5KQoJCXMxKz1nKGJ4LGJ5LHh5WzBdLHh5WzFdKQoJZW5kCglzMS89Mi4wCgkjcCBbYngsYnkseHlbMF0seHlbMV1dCglhcmVhUz1zMStzMAoJI3AgWyJzIixhcmVhUyxhcmVhUyoyXSBpZihkZWVwPT0zMikKCXJldHVybiBhcmVhUwplbmQKCmRlZiBzZWFyY2hCKGRlZXAsbixwMSxyMSxyMix4cyx5cyxhbGxTKQoJcjM9KHIxK3IyKS8yLjAKCXJ4MD14c1twMV0qKDEuMC1yMykreHNbKHAxKzEpJW5dKnIzCglyeTA9eXNbcDFdKigxLjAtcjMpK3lzWyhwMSsxKSVuXSpyMwoJYjE9ZmFsc2UKCWIxPXRydWUgaWYgcngwPT14c1twMV0gJiYgcnkwPT15c1twMV0KCWIxPXRydWUgaWYgcngwPT14c1socDErMSklbl0gJiYgcnkwPT15c1socDErMSklbl0KCWlmIDI5PGRlZXAgfHwgYjE9PXRydWUgdGhlbgoJCSNyeDA9eHNbcDFdKigxLjAtcjMpK3hzWyhwMSsxKSVuXSpyMwoJCSNyeTA9eXNbcDFdKigxLjAtcjMpK3lzWyhwMSsxKSVuXSpyMwoJCXJ4eTA9bGVuQ2hlY2socngwLHJ5MCkKCQlyeD1yeHkwWzBdCgkJcnk9cnh5MFsxXQoJCXMwPWNhbGNTKGRlZXAsbixwMSxyMyxyMyx4cyx5cywwLjApCgkJcmQ9KGFsbFMtczAqMikuYWJzCgkJcmV0dXJuIFtyZCxyeCxyeV0KCWVsc2UKCQlzMT1jYWxjUyhkZWVwLG4scDEscjEscjIseHMseXMsMC4wKQoJCWQxPShzMSoyLWFsbFMpLmFicwoJCXMyPWNhbGNTKGRlZXAsbixwMSxyMSxyMix4cyx5cywwLjAwMDAwMDAwMDEpCgkJZDI9KHMyKjItYWxsUykuYWJzCgkJaWYgZDE8ZDIgdGhlbgoJCQlyZXR1cm4gc2VhcmNoQihkZWVwKzEsbixwMSxyMSxyMyx4cyx5cyxhbGxTKQoJCWVsc2UKCQkJcmV0dXJuIHNlYXJjaEIoZGVlcCsxLG4scDEscjMscjIseHMseXMsYWxsUykKCQllbmQKCWVuZAplbmQKZGVmIGYobikKCXhzPVtdCgl5cz1bXQoJeHMwPVtdCgl5czA9W10KCgluLnRpbWVzewoJCXgseT1nZXRzLnNwbGl0KCIgIikubWFwe3xlfCBlLnRvX2Z9CgkJeHM8PHgKCQl5czw8eQoJCXhzMDw8eAoJCXlzMDw8eQoJfQoJCglhbGxTPWNhbGNBbGxTKHhzLHlzLG4pCgl4czAuc2l6ZS50aW1lc3t8cDF8CgkJbj14cy5zaXplCgkJYng9eHMwW3AxXQoJCWJ5PXlzMFtwMV0KCQlwMj1zZWFyY2hQKGJ4LGJ5LHhzLHlzLG4pCgkJYXg9eHNbcDJdCgkJYXk9eXNbcDJdCgkJZHg9eHNbKHAyKzEpJW5dLXhzW3AyXQoJCWR5PXlzWyhwMisxKSVuXS15c1twMl0KCQl4eT1jYWxjQ3Jvc3MobixwMixieCxieSx4cyx5cykKCQl4cy5pbnNlcnQocDIrMSx4eVswXSkKCQl5cy5pbnNlcnQocDIrMSx4eVsxXSkKCX0KCW49eHMuc2l6ZQoJJG1lbW89WzAuMF0KCW1lbW9zPTAuMAoJbi50aW1lc3t8cDF8CgkJcDI9KHAxKzEpJW4KCQltZW1vcys9Zyh4c1twMV0seXNbcDFdLHhzW3AyXSx5c1twMl0pLzIuMAoJCSRtZW1vPDxtZW1vcwoJfQoJCglhbGxBbnM9W10KCW4udGltZXN7fGl8CgkJcDE9aQoJCXAyPShpKzEpJW4KCQlhbGxBbnM8PHNlYXJjaEIoMCxuLHAxLDAuMCwxLjAseHMseXMsYWxsUykKCX0KCWFsbEFucy5zZWxlY3Qhe3xlfAoJCShlWzBdLm5hbj8pP2ZhbHNlOnRydWUKCX0KCWUxPWFsbEFucy5taW4KCSNwIGUxWzBdCglwdXRzIHNwcmludGYoIiUwLjE1ZiAlMC4xNWYiLGUxWzFdLGUxWzJdKQplbmQKbj0xCndoaWxlIG4+MAoJbj1nZXRzLnRvX2kKCWJyZWFrIGlmIG49PTAKCWYobikKZW5k