1. 程式人生 > >正直角三角形(思維+數學)

正直角三角形(思維+數學)

D “正直角三角形”

Description

在平面直角座標系的第一象限內有M個點。“正直角三角形”是一種奇特的三角形,它的三個頂點分別在原點、X軸的正方向和Y軸的正方向。請用一個面積最小的“正直角三角形”將這些點全部圍住,求解面積的大小。題目中所有的座標(包括正直角三角形的頂點座標)都為整數。

Input

有多組樣例(不超過100組),每組樣例第一行包括一個正整數M,接下來M行每行包括兩個正整數xi,yi表示第i個點的座標。

(1<=M,xi,yi<=100)

Output
每行一個答案(保留一位小數)。
Sample Input

2
1 1
1 2
2
1 2
1 3

Sample Output

4.0
6.0

【題意】求一條能把所有點包圍的直線與x、y座標軸圍成面積的最小值。

【分析】資料很小,暴力一點還是沒關係的吧。找出所有點中x和y的最大值,此時過該最大值組成的點的圍成三角形面積為maxS=(maxX+maxY)^2/2,所以可得,最大的高是h0=maxS/maxX;那麼遍歷h,從maxY+1開始到h0結束(座標是整數),將點(0,h)和每個點連線,求最大寬度,從而求的最小面積。

【程式碼】

#include<bits/stdc++.h> 
using namespace std;

struct node{
	int x,y;
}point[105];

int main()
{
	int m;
	while(~scanf("%d",&m))
	{
		int maxX=-1,maxY=-1;
		for(int i=0;i<m;i++)
		{
			scanf("%d%d",&point[i].x,&point[i].y);
			maxX=max(maxX,point[i].x);
			maxY=max(maxY,point[i].y);
		}
		int h0=(maxX+maxY)*(maxX+maxY)/maxX;
		int ans=1<<20;
		for(int h=maxY+1;h<=h0;h++)
		{
			int maxWid=0;
			for(int i=0;i<m;i++)
				maxWid=max((int)ceil(1.0*point[i].x*h/(h-point[i].y)),maxWid);
			ans=min(ans,maxWid*h);
		}
		printf("%.1lf\n",ans/2.0);
	}
	return 0;
}