正直角三角形(思維+數學)
阿新 • • 發佈:2018-12-03
D “正直角三角形”
Description
在平面直角座標系的第一象限內有M個點。“正直角三角形”是一種奇特的三角形,它的三個頂點分別在原點、X軸的正方向和Y軸的正方向。請用一個面積最小的“正直角三角形”將這些點全部圍住,求解面積的大小。題目中所有的座標(包括正直角三角形的頂點座標)都為整數。
Input
有多組樣例(不超過100組),每組樣例第一行包括一個正整數M,接下來M行每行包括兩個正整數xi,yi表示第i個點的座標。
(1<=M,xi,yi<=100)
Output
每行一個答案(保留一位小數)。
Sample Input2
1 1
1 2
2
1 2
1 3Sample 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; }