列表

详情


NC207032. 不平行的直线

描述

在坐标纸上有N个不重合的点,两两可以连一个线段并延伸成直线,请问在这些直线里最多能选出多少条使得他们两两不平行也不重合。

输入描述

第1行: 输入1个正整数:N

第2..N+1行:第i+1行是两个用空格隔开的整数,为点i的坐标(Xi,Yi)

输出描述

输出1个整数,为最多的互不平行的直线数目。

示例1

输入:

3
1 0
-2 0
0 0

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 1248K, 提交时间: 2020-05-25 19:51:58

#include<bits/stdc++.h>
using namespace std;
#define ll long long


double a[11111][2];
set<double>s;
int main(){
    ll n,i,j,t,k,x,cnt=0;
    cin>>n;
    for(i=0;i<n;i++)cin>>a[i][0]>>a[i][1];
    for(j=0;j<n;j++)for(i=j+1;i<n;i++){
        double x=a[i][0]-a[j][0],y=a[i][1]-a[j][1];
        if(y==0)cnt=1;
        else s.insert(x/y);
    }
    cout<<cnt+s.size();
}

Python3(3.5.2) 解法, 执行用时: 31ms, 内存消耗: 4392K, 提交时间: 2020-10-02 21:40:51

nb = int(input())
arr, line, o_cg = [], set(), 0

for i in range(nb):
    arr.append([*map(int, input().strip().split())])

for i in range(nb - 1):
    for j in range(i + 1, nb):
        if arr[j][0] == arr[i][0]:
            o_cg = 1
            continue
        k = (arr[j][1] - arr[i][1]) / (arr[j][0] - arr[i][0])
        line.add(k)

print(len(line) + o_cg)

C++11(clang++ 3.9) 解法, 执行用时: 14ms, 内存消耗: 1612K, 提交时间: 2020-06-11 20:35:07

#include <stdio.h>
#include <map>
int n, m, i, j, k, a, b, x[205], y[205];
std::map <double, int> f;
int main(){
	scanf("%d", &n);
	for(i=1; i<=n; i++){
		scanf("%d%d", &x[i], &y[i]);
		for(j=1; j<i; j++){
			a = x[i] - x[j], b = y[i] - y[j];
			if(a) f[1.0*b/a] = 1;
			else k = 1;
		}
	}
	printf("%d\n", k+f.size());
	return 0;
}

上一题