您的位置:首页 > 理论基础 > 计算机网络

“正直角三角形” Contest2074 - 中南大学第九届大学生程序设计竞赛网络预选赛

2015-05-01 15:52 288 查看
最大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

对同一个h 找出最大的w 便能包住所有点

再找出最小的h*w即可

看过这份代码,但不是很懂,不知道具体怎么算的  链接  http://blog.csdn.net/u013023344/article/details/45133621

以下是我的代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐