51Nod-1100 斜率最大-斜率最大最小問題
阿新 • • 發佈:2018-11-26
問題描述:
平面上有N個點,任意2個點確定一條直線,求出所有這些直線中,斜率最大的那條直線所通過的兩個點。
(點的編號為1-N,如果有多條直線斜率相等,則輸出所有結果,按照點的X軸座標排序,正序輸出。資料中所有點的X軸座標均不相等,且點座標為隨機)
AC程式碼:
struct P//點
{
int x;
int y;
int id;//下標
};
P p[10010];
double k[10010];//k[i] = (p[i].y - p[i - 1].y) / (p[i].x - p[i - 1].x)
bool cmp(const P &a,const P &b)//按x座標由小到大排序
{
return a.x < b.x;
}
int main()
{
int n;
cin >> n;//n個點
for(int i = 1; i <= n; ++i)
{
scanf("%d%d",&p[i].x,&p[i].y);
p[i].id = i;
}
sort(p + 1,p + n + 1,cmp);//排序
for(int i = 2; i <= n; ++i)//求出相鄰點的斜率
k[i] = (double)(p[i].y - p[i - 1 ].y) / (p[i].x - p[i - 1].x);
double max_k = -inf;
for(int i = 2; i <= n; ++i)//取這些斜率中的最大值
max_k = max(max_k,k[i]);
for(int i = 2; i <= n; ++i)
if(fabs(k[i] - max_k) < 1e-8)//可能有若干個最大值
printf("%d %d\n",p[i - 1].id,p[i].id);//輸出所有結果
return 0;
}
解決方法:
這道計算幾何題目有一個結論那就是
假設
如果ABC三點共線,則
否則三點的連線將形成一個三角形
通過固定任意兩點,上下移動剩下的那個點時,有6種情況,均滿足: