2018.3.22 美团2018校招笔试

总体来说体验不错,考题总共分为四个部分,前三部分涉及较广,连编译原理,软件工程,汇编都考到了一点。数学部分偏概率和排列组合,但都是高中的常规考题。

要吐槽的就是有两道图片逻辑题了,眼瞎(星际)的我是在看不出什么规律:

郑重声明!下面考题的图片来自http://a.xiumi.us/board/v5/39Vza/81056540

这里写图片描述

这里写图片描述

各位看官们找到规律了吗,反正这两道我当时是凭感觉选的。。。

好像还有一道概率题,红绿灯的那个,四个答案都没正确的?我自己算的答案选择题里没有,事后在讨论区也看到一部分人吐槽这道题。不知道是我们错了,还是MT的锅。。。

第四部分编程题

中规中矩,两道题算都AC了吧。

第一道图论,求给的简单图中加多少边能成为闭图。
思路:
纪录每个点的度数,按照度数排序,找到刚好满足d(u)+d(v)>=n的,扫描右面的,检查是否有直连边,纪录即可。
这里写图片描述

#include<iostream>
#include <bits/stdc++.h>
using namespace std;

struct Point
{
    int Id;
    int Degree;
};
int cmp(const void* p1, const void *p2)
{
    Point *pt1 = (Point*)p1, *pt2 = (Point*)p2;
    return pt1->Degree - pt2->Degree;
}
int binary(Point ps[], int n, int de)
{
    int start = 0, end = n - 1;
    while (start <= end) {
        int mid = (start + end) / 2;
        if (ps[mid].Degree < de)
            start = mid + 1;
        else if (ps[mid].Degree >= de)
            end = mid - 1;
    }
    if (end == n - 1)
        return -1;
    return end + 1;
}

int main()
{
//    freopen("in.txt","r",stdin);
//  while (true)
//  {
        int added = 0;
        int pointc, edgec;
        int flag[55][55] = {};
        Point points[55];
        scanf("%d%d", &pointc, &edgec);
        for (int s = 0; s < pointc; s++)
        {
            points[s].Id = s;
            points[s].Degree = 0;
        }
        for (int s = 0; s < edgec; s++)
        {
            int p1, p2;
            scanf("%d%d", &p1, &p2);
            flag[p1 - 1][p2 - 1] = 1;
            flag[p2 - 1][p1 - 1] = 1;
            points[p1 - 1].Degree++;
            points[p2 - 1].Degree++;
        }
        qsort(points, pointc, sizeof(Point), cmp);
        for (int s = pointc - 1; s >= 0; s--)
        {
            int low = pointc - points[s].Degree;
            int index = binary(points, pointc, low);
            while (index < pointc)
            {
                if (index != s)
                {
                    if (flag[points[s].Id][points[index].Id] == 0&& flag[points[index].Id][points[s].Id]== 0)
                    {
                        flag[points[s].Id][points[index].Id] = 1;
                        flag[points[index].Id][points[s].Id] = 1;
                        added++;
                    }
                }
                index++;
            }
        }
        printf("%d\n", added);
//  }
    return 0;
}

第二道就是一个字符串结构体排序,很简单,直接换C++写了。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[100];
struct Qu
{
    string s;
    double X,Y;
    int d;
};
int so(double x,double y)
{
    double a = y/x;
    if(a<=0.3&&a>=0)
    {
        return 5;
    }
    else if(0.3<a&&a<=0.6)
    {
        return 4;
    }
    else if(0.6<a&&a<=1)
    {
        return 3;
    }
}

bool cmp(Qu s1,Qu s2) {
    return s1.s < s2.s;
}

int main()
{
//    freopen("in.txt","r",stdin);

    Qu a[110];
    int n;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        cin>>a[i].s>>a[i].X>>a[i].Y;
        int t = so(a[i].X,a[i].Y);
        a[i].d = t;
    }
    sort(a,a+n,cmp);
    for(int i = 0; i < n; i++) {
        cout<<a[i].s<<" "<<a[i].d<<endl;;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/major_zhang/article/details/79672269