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;
}