1. 程式人生 > >51Nod-1100 斜率最大-斜率最大最小問題

51Nod-1100 斜率最大-斜率最大最小問題

問題描述:
平面上有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; }

解決方法:
這道計算幾何題目有一個結論那就是


假設 xA<xB<xC
如果ABC三點共線,則 kAB=kBC=kAC
否則三點的連線將形成一個三角形
通過固定任意兩點,上下移動剩下的那個點時,有6種情況,均滿足:
max k=max(kAB,kBC)