0828 文远笔试(三道编程题)
前言
前面一直在实习,没开始投简历,终于实习跑路开始投简历了
第一题
题意:在一个二维平面上给你 n n n个点,用坐标 ( x , y ) (x,y) (x,y)表示,问最多有多少个点在同一直线上。
做题过程:很久没刷题了,没有在第一时间想到正解,没有明显的思路,就去做第三题了,回头做的时候像不出什么好的想法,就先想用暴力骗分,当暴力写出来的时候也想到了正解,不过暴力只能过 50 % 50\% 50%(纯暴力,不优化)。,
思路:这道题不能直接求某一个线段上有多少个点。需要换一个思路,都知道两个点可以确定一条直线,一条直线就存在他的斜率,我们定义三个点 A , B , C A,B,C A,B,C,如果直线AB的斜率和直线AC的斜率相同,那么ABC三点就在同一条直线上,(这个思路居然是我写暴力的时候猛然想到的,看来不刷题真的是会退步的)。这样就很好办了,枚举一个点和其他点的斜率,记录不同每个斜率出现了多少次,然后求最大值就好;
暴力代码(50%)
#include<bits/stdc++.h>
using namespace std;
struct Point{
Point(int x_=0,int y_=0):x(x_),y(y_){
};
int x,y;
bool operator<(const Point &t)const{
if(t.x==x){
return y<t.y;
}
else return x<t.x;
}
};
struct k_and_b{
int x,y,b;
bool operator <(const k_and_b &t)const {
if(x==t.x&&y==t.y)
return b<t.b;
else if(x==t.x)
return y<t.y;
else return x<t.x;
}
};
int main()
{
int n;
int x,y,ans=0,cnt_x_0=0,cnt_y_0=0;
scanf("%d",&n);
vector<Point>point;