51Nod--1100-斜率最大


51Nod--1100-斜率最大

 

平面上有N個點,任意2個點確定一條直線,求出所有這些直線中,斜率最大的那條直線所通過的兩個點。
 
(點的編號為1-N,如果有多條直線斜率相等,則輸出所有結果,按照點的X軸坐標排序,正序輸出。數據中所有點的X軸坐標均不相等)
Input
第1行,一個數N,N為點的數量。(2 <= N <= 10000)
第2 - N + 1行:具體N個點的坐標,X Y均為整數(-10^9 <= X,Y <= 10^9)
Output
每行2個數,中間用空格分隔。分別是起點編號和終點編號(起點的X軸坐標 < 終點的X軸坐標)
Input示例
5
1 2
6 8
4 4
5 4
2 3
Output示例
4 2

 

 

 

題解: 

計算幾何的經典題目 (學cv的很有必要掌握) 

1,  因為題目中說 任意兩個點的x軸不相同,所以說每兩個點之間必定有斜率

2,這種情況下, 將 眾點 按x軸 sort 之后, 發現: 斜率最大的線段只可能存在於兩兩相鄰的點之間。 

3, 多個相同的,需要一並輸出,建立一個stack來存answer 即可。 

 

 

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <cstdlib> 
using namespace std; 
const int MAXN = 10000 + 5; 

int n, top, save[MAXN][2]; 

struct Node{
	int x, y, idx; 
}nd[MAXN]; 

int cmp(const void *a, const void *b){
	Node *aa = (Node *)a; 
	Node *bb = (Node *)b; 
	return (aa->x - bb->x); 
}

double computeSlope(const Node &a, const Node &b){
	return (1.0*(a.y - b.y)/(a.x - b.x)); 
}

int main(){
	freopen("in.txt", "r", stdin); 

	int xx, yy; 
	while(scanf("%d", &n) != EOF){
		for(int i=0; i<n; ++i){
			scanf("%d %d", &xx, &yy); 
			nd[i].x = xx; 
			nd[i].y = yy; 
			nd[i].idx = i + 1; 
		}
		qsort(nd, n, sizeof(nd[0]), cmp); 
		top = 0; 
		double tmp_slope, max_slope = -1000000.0; 
		for(int i=1; i<n; ++i){
			tmp_slope = computeSlope(nd[i], nd[i-1]); 
			if(max_slope < tmp_slope){
				max_slope = tmp_slope; 
				top = 0; 
			}else if(max_slope == tmp_slope){
				top++; 
			}else{
				continue; 
			}
			save[top][0] = nd[i-1].idx; 
			save[top][1] = nd[i].idx; 
		}
		for(int i=0; i<=top; ++i){
			printf("%d %d\n", save[i][0], save[i][1]);
		}
	}
	return 0; 
}

  

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com