Skip to content

11350: 【原1350】穿越沙漠

题目

题目描述

author: SSY 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1350

Description

塞尔达公主又又又又被抓走了。林克为了找到她需要穿过拉纳鲁沙漠,坏消息是林克可能没有足够的体力穿越沙漠,好消息是沙漠中分布着N个力之果实,坏消息是我们的林克只能走直线。为了穿越沙漠,林克希望能够吃到尽可能多的力之果实。现在请你帮他规划一条直线,使他能够获得尽可能多的力之果实。

Input Format

输入第一行有一个数N,表示沙漠中果实的数量。

接下来的N行每行两个正整数x,y,表示每个力之果实的坐标。

Output Format

输出一个数,表示林克最多能够获得的力之果实的数量。

Sample Input

5
4 4
2 2
9 9
9 11
17 8

Sample Output

3

说明

对于70%的数据,N<=300

对于100%的数据,N<=700

yyong119's solution

#include <iostream>
#include <algorithm>
#include <cstring>
#define MAX_N 705
#define INF 0x3f3f3f3f
using namespace std;

int n;
int x[MAX_N], y[MAX_N];

int main() {

    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> x[i] >> y[i];
    int max = 2;
    for (int i = 0; i < n; ++i) {
        double tan[n];
        memset(tan, 0, sizeof(tan));
        tan[i] = INF + 1;
        for (int j = 0; j < n; ++j)
            if (i != j)
                if (x[i] == x[j])
                    tan[j] = INF;
                else
                    tan[j] = (double)(y[j] - y[i]) / (x[j] - x[i]);

        sort(tan, tan + n);
        int tmp_max = 0, cnt = 1;
        for (int j = 1; j < n; ++j)
            if (tan[j] == tan[j - 1])
                ++cnt;
            else {
                if (cnt > tmp_max)
                    tmp_max = cnt;
                cnt = 1;
            }
        if (tmp_max + 1 > max) max = tmp_max + 1;
    }
    cout << max << endl;
    return 0;
}