2020 牛客网暑期训练营补题(第二场)

假还是不能摸鱼了,尽量每天补一道题。

这里大部分的补题应该都是参考了大佬的题解,所以如果有大佬看到了自己的解法,请多多包涵。

第二场

    • B题
    • C题
    • F题
      • 题目描述
      • 题目思路
      • 代码

B题

2020 牛客网暑期训练营补题(第二场)_第1张图片
题目意思:给定在二维平面上的n个点。找到一个圆使尽可能多的点在以该点为圆心的边界上,该圆过原点。打印最大可能的数量。
想法:在比赛过程中,朋友就说了不共线三点可以确定一个圆,加上题目说这个圆过原点,也就是说构成一个这样的圆至少还需要给的两个点。所以打算首先把可能的圆先确定,再之后去判断哪个圆边上点最多。看了一下数据n<=2000,所以O(n2)也可以过。直接暴力估计是O(n3),所以要优化一下。
圆心的处理用圆心的板子,看了大佬直接贴的,自己也想了一下。

double eps=1e-10;//精度
struct point{
    double x,y;
}p[N];

void Circle_center(point p1,point p2,point p3)//圆心
{
    double a = p1.x - p2.x;
    double b = p1.y - p2.y;
    double c = p1.x - p3.x;
    double d = p1.y - p3.y;
    double e = ((p1.x * p1.x - p2.x * p2.x) + (p1.y * p1.y - p2.y * p2.y)) / 2.0;
    double f = ((p1.x * p1.x - p3.x * p3.x) + (p1.y * p1.y - p3.y * p3.y)) / 2.0;
    double det = b * c - a * d;
    if (fabs(det) < eps) {
        X=Y=0;
        return ;
    }
    X = -(d * e - b * f) / det;
    Y = -(a * f - c * e) / det;
    return ;
}

处理完圆心之后

int main()
{
    int n,ans=0;
    point p0;
    p0.x=p0.y=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%lf%lf",&p[i].x,&p[i].y);
    for(int i=0;i<n;i++) 
    {
        m.clear();//清空map
        for(int j=i+1;j<n;j++){
            if((p[i].x*p[j].y-p[j].x*p[i].y)==0) continue;//共线
            Circle_center(p0,p[i],p[j]);//求圆心
            m[{X,Y}]++;//该圆心
            ans=max(ans,m[{X,Y}]);
        }
    }
    printf("%d",ans+1);
    return 0;
}

本题知识点:圆心的板子,map的运用。

C题

2020 牛客网暑期训练营补题(第二场)_第2张图片
当时和队友看这道题的时候,一开始没明白题意。队友解释了也没太懂,然后没有参与讨论这一题了。

赛后看题解一开始也是懵的,后来大致知道是要添加边使所有的点、边都处在环中。理解了题意之后,也不是很理解为什么别人的解题思路上来就是说连接的一定是叶子结点。后来想了一下,题目要求了要用最少的边,所以必须要选叶子结点。

大佬理解中提到在处理叶子结点之间的联系时,要用到dfs序。如果题目中出现了没有按照完全二叉树序号那样的样例,答案就会错。

相关知识点:对结点、边的处理方式;dfs序

大佬参考题解

F题

题目描述

2020 牛客网暑期训练营补题(第二场)_第3张图片题目就是说给你一个n*m的矩阵和一个变量k,矩阵中aij=i和j的最小公倍数。现在要求出所有k *k子矩阵中最大的最小公倍数数的和。

题目思路

当时这道题目伙伴们提示了用滑动窗口,但是滑动窗口我只见识过一维的,二维的一下子没有转过来。所以最终还是没有做出来。

实际上这一题只需要对每一行先做一次滑动窗口的操作,把i~k+i中的最大值存在k+i中。然后再对列做一次滑动窗口的操作即可,把上面处理过的按照j ~k+j存到k+j。这样 akk存的就是第一个k*k矩阵的最大最小公倍数。

代码

你可能感兴趣的:(2020 牛客网暑期训练营补题(第二场))