→ 确定 h 的范围
最大 x 为 xm,最大 y 为 ym
三角形高为 h 宽为 w
过 (xm, ym) 做一条倾斜角为 135 度的直线 这条直线与 x 轴 y 轴一定能将这些点包住
易知这条直线在 x, y 轴上截距均为 xm+ym
hmax = h0 = (xm+ym)^2/xm
hmin = ym+1
→ 遍历 h 的所有可能 找出对应的 w
方法是连接 (0,h) (x[i],y[i]) 这条直线一定能包住 (x[i],y[i]) 即可求出w
根据三角形相似原理可得,w / x[i] = h / (h - y[i])
→ 对同一个 h 找出最大的 w 便能包住所有点
→ 再找出最小的 h*w 即可
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
int x[100+10],y[100+10];
int main()
{
int m;
while(~scanf("%d",&m))
{
int xm=0,ym=0;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x[i],&y[i]);
if(x[i]>xm) xm=x[i];
if(y[i]>ym) ym=y[i];
}
int h0=(xm+ym)*(xm+ym)/xm;
int ans=1<<20;
for(int h=ym+1;h<=h0;h++)
{
int w=0;
for(int i=0;i<m;i++)
w=max((int) ceil(1.0*x[i]*h/(h-y[i])),w); //ceil
ans=min(ans,w*h);
}
printf("%.1f\n", ans/2.0);
}
return 0;
}