zoukankan      html  css  js  c++  java
  • 51nod 1100 斜率最大

    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


    这题数据水,可以暴力过,不过最优解是nlogn 斜率最大的一定是相邻的两个点。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 1e4+10;
     4 struct Point{
     5     int x, y;
     6     int id;
     7 }p[N];
     8 struct Nod{
     9     double k;
    10     int id1, id2;
    11 }nod[N];
    12 bool cmp1(Point &a, Point &b) {
    13     return a.x < b.x;
    14 }
    15 bool cmp2(Nod &a, Nod &b) {
    16     return a.k > b.k;
    17 }
    18 int main() {
    19     int n;
    20     cin >> n;
    21     for(int i = 0; i < n; i ++) {
    22         cin >> p[i].x >> p[i].y;
    23         p[i].id = i+1;
    24     }
    25     sort(p,p+n,cmp1);
    26     for(int i = 0; i < n-1; i ++) {
    27         nod[i].k = (p[i+1].y-p[i].y)/(p[i+1].x-p[i].x);
    28         nod[i].id1 = p[i].id;
    29         nod[i].id2 = p[i+1].id;
    30     }
    31     sort(nod,nod+n-1,cmp2);
    32     cout << nod[0].id1 << ' ' << nod[0].id2 << endl;
    33     return 0;
    34 }
  • 相关阅读:
    LINQ查询操作符之First、FirstOrDefault、Last、LastOrDefault、ElementAt、ElementAtOrDefault、Contains、Any、All、Coun
    .Net 使用的快捷键
    P2073 送花
    洛谷P1514 引水入城
    花园
    八数码难题
    并查集题目整理
    树链剖分(强势借鉴)
    模拟题
    考试整理
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8934093.html
Copyright © 2011-2022 走看看