ABC 248 | E - K-colinear Line

题目描述

给定平面上不相重合的N个点,计算穿过其中K个点的线的条数,若有无穷条,输出Infinity

数据范围

  • 1KN300
  • |Xi|,|Yi|109
  • XiXjorYiYj,if ij

题解

k=1,则答案为Infinity
k2,由于两点确定一条直线且本题至多有300个点,可以暴力枚举两个点,然后枚举剩余点是否在该直线上,通过一个二维数组st[i][j]记录第i和点与第j个点所在直线是否被计算,对于在一条直线上的n个点,两两之间不该被再次计算。
通过(x0,y0)的直线可被表示为(yy0)=k(xx0),判断点(x2,y2)是否在(x0,y0)x1,y1所在直线上,可通过y2y0x2x0=y1y0x1x0,即(y2y0)(x1x0)=(y1y0)(x2x0)

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

typedef long long ll;

using namespace std;

typedef pair<ll, ll> pii;

const int N = 310;

pii a[N];
ll n, k;
bool st[N][N];
vector<int> vec;

int main()
{
    scanf("%d%d", &n, &k);
    for(int i = 0; i < n; i ++){
        ll x, y;
        scanf("%lld%lld", &x, &y);
        a[i] = {x, y};
    }
    if(k == 1) puts("Infinity");
    else{
        int ans = 0;
        for(int i = 0; i < n; i ++){
            for(int j = i + 1; j < n; j ++){
                if(!st[i][j]){
                    int cnt = 2;
                    vec.clear();
                    vec.push_back(i), vec.push_back(j);
                    for(int l = j + 1; l < n; l ++){
                        ll x0 = a[i].first, y0 = a[i].second;
                        ll x1 = a[j].first, y1 = a[j].second;
                        ll x2 = a[l].first, y2 = a[l].second;
                        if((y1 - y0) * (x2 - x0) == (y2 - y0) * (x1 - x0)){
                            vec.push_back(l);
                            cnt ++;
                        }
                    }
                    for(int x = 0; x < vec.size(); x ++){
                        for(int y = 0; y < vec.size(); y ++){
                            st[vec[x]][vec[y]] = true;
                        }
                    }
                    if(cnt >= k) ans ++;
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

posted @   小菜珠的成长之路  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示