51Nod 1100 斜率最大
2016-12-11 22:30
218 查看
平面上有N个点,任意2个点确定一条直线,求出所有这些直线中,斜率最大的那条直线所通过的两个点。
(点的编号为1-N,如果有多条直线斜率相等,则输出所有结果,按照点的X轴坐标排序,正序输出。数据中所有点的X轴坐标均不相等)
Input
Output
Input示例
Output示例
分析:找到相邻两个点斜率的最大值
#include <stdio.h>
#include <algorithm>
#define MAXN 10009
using namespace std;
struct point
{
double x, y;
int rank;
}a[MAXN];
bool cmp1(point a, point b)
{
return a.x < b.x; //按横坐标从小到大排列
}
struct node
{
double x, k;
int s, e;
}b[MAXN];
bool cmp2(node a, node b)
{
if(a.k == b.k)
return a.x < b.x;
return a.k > b.k;
}
int main()
{
int n;
while(scanf("%d",&n)!= EOF)
{
for(int i=1; i<=n; i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
a[i].rank = i;
}
sort(a+1, a+1+n, cmp1);
int cnt = 0;
double maxk = -2*1000000000;
for(int i=2; i<=n; i++)
{
b[cnt].x = a[i-1].x;
b[cnt].s = a[i-1].rank;
b[cnt].e = a[i].rank;
b[cnt].k = (a[i].y-a[i-1].y)/(a[i].x-a[i-1].x);
if (b[cnt].k > maxk)
maxk = b[cnt].k;
cnt++;
}
sort(b, b+cnt, cmp2);
for(int i = 0; i < cnt; i++)
{
if(b[i].k == maxk)
printf("%d %d\n",b[i].s,b[i].e);
if(b[i].k < maxk)
break;
}
}
return 0;
}
(点的编号为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
分析:找到相邻两个点斜率的最大值
#include <stdio.h>
#include <algorithm>
#define MAXN 10009
using namespace std;
struct point
{
double x, y;
int rank;
}a[MAXN];
bool cmp1(point a, point b)
{
return a.x < b.x; //按横坐标从小到大排列
}
struct node
{
double x, k;
int s, e;
}b[MAXN];
bool cmp2(node a, node b)
{
if(a.k == b.k)
return a.x < b.x;
return a.k > b.k;
}
int main()
{
int n;
while(scanf("%d",&n)!= EOF)
{
for(int i=1; i<=n; i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
a[i].rank = i;
}
sort(a+1, a+1+n, cmp1);
int cnt = 0;
double maxk = -2*1000000000;
for(int i=2; i<=n; i++)
{
b[cnt].x = a[i-1].x;
b[cnt].s = a[i-1].rank;
b[cnt].e = a[i].rank;
b[cnt].k = (a[i].y-a[i-1].y)/(a[i].x-a[i-1].x);
if (b[cnt].k > maxk)
maxk = b[cnt].k;
cnt++;
}
sort(b, b+cnt, cmp2);
for(int i = 0; i < cnt; i++)
{
if(b[i].k == maxk)
printf("%d %d\n",b[i].s,b[i].e);
if(b[i].k < maxk)
break;
}
}
return 0;
}
相关文章推荐
- 51nod 1100:斜率最大
- 51nod 1100 斜率最大
- 51nod 1100 斜率最大
- 51nod 1100 斜率最大
- 51nod_1100_斜率最大
- 51nod-1100 斜率最大
- 51NOD 1100 斜率最大
- 【51nod 1100】斜率最大
- 51nod 1100 斜率最大
- 51Nod-1100-斜率最大
- 51Nod-1100 斜率最大
- 51nod 1100 斜率最大
- 51Nod 1100 斜率最大
- 51Nod-斜率最大
- 51Nod 斜率最大
- 1100 斜率最大(找规律)
- 51Nod 斜率最大
- 【51NOD】斜率最大
- 51nod oj 1100 斜率最大
- 51Nod 斜率最大(拉勾专业算法能力测评)