题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1100

题意:中文题啦~

思路:算斜率不用多说吧?本题唯一一个小问题是数据量是1e4,O(n^2)可能超时,我们可以用个小技巧来解决这个问题;

对这些点用x坐标排序,斜率最大的点一定是排序后相邻的两个点。

上述结论的正确性我们不难证明:

对于已排序的3个点a, b, c,通过画图我们可以知道其有3种排列方式:

1. c在ab延长线上,此时他们的斜率相等;

2. c在ab延长线下侧,很显然此时斜率最大的是ab;

3. c在ab延长线上侧,那么此时ac>ab,bc>ac,所以斜率最大的是bc;

通过上述分析我们可以发现,对于一个点x, 若其后存在点y使得斜率xy>xx+1,那么一定有y-1y>xy,所以斜率最大的两点一定是x坐标相邻的两点;

代码:

 #include <bits/stdc++.h>
#define MAXN 10010
using namespace std; struct Node{
int x, y, number;
}gg[MAXN]; bool cmp(Node a, Node b){
return a.x<b.x;
} int main(void){
std::ios::sync_with_stdio(false), cin.tie(), cout.tie();
int n;
cin >> n;
for(int i=; i<n; i++){
cin >> gg[i].x >> gg[i].y;
gg[i].number=i+;
}
sort(gg, gg+n, cmp);
queue<int> node1, node2;
double cnt=, cc=;
for(int i=; i<n; i++){
cnt=(gg[i].y-gg[i-].y)*1.0/(gg[i].x-gg[i-].x);
if(cnt>cc){
cc=cnt;
while(!node1.empty()){
node1.pop();
}
while(!node2.empty()){
node2.pop();
}
node1.push(gg[i-].number);
node2.push(gg[i].number);
}else if(cnt==cc){
node1.push(gg[i-].number);
node2.push(gg[i].number);
}
}
while(!node1.empty()){
cout << node1.front() << " " << node2.front() << endl;
node1.pop();
node2.pop();
}
return ;
}
05-20 09:35