百度开发笔试题解

3小时2场重叠的笔试,百度是后一个..以为肯定做不完了.还好题目简单..
编程3个,2个签到一个hard..要是最后一题简单点就不写题解了..

1.给n,m,k,范围1e9,求满足条件的自然数a,b,(n-a)(m-b)<=k,且a+b最小
acm签到题的感觉..只在n,m中较小的一个减可以保证a+b最小,类似均值不等式的原理...就是和一定的时候2个数越接近积越大,反之也是。
n,m已经定了,要让他们的和减少最小的情况下积减少最大,就让他们的差值尽量大,所以全减到最小的上保证差值最大。
(n-a)*m<=k,移项出来O(1)的公式就行
#include <bits/stdc++.h>
using namespace std;
#define LL long long

int main()
{
	int i, j;
	LL n, m, k;
	while (~scanf("%lld%lld%lld", &n, &m, &k))
	{
		if (n > m)
			swap(n, m);
		printf("%lld\n", n - k / m);
	}
	return 0;
}

2.给n个任务,每个任务一个ddl,一个完成该任务需要的时间,一次只能做一个任务直到做完,问可不可能每个任务都在ddl之前完成。范围2e5
贪心..对ddl排序,先做ddl小的就是最优解....
#include <bits/stdc++.h>
using namespace std;
#define LL long long
struct node{ int a, b; }t[200005];
bool cmp(node x, node y)
{
	return x.b < y.b;
}
int main()
{
	int i, j;
	int n;
	scanf("%*d");
	while (~scanf("%d", &n))
	{
		for (i = 0; i < n; i++)
			scanf("%d%d", &t[i].a, &t[i].b);
		sort(t, t + n, cmp);
		LL sum = 0;
		for (i = 0; i < n; i++)
		{
			sum += t[i].a;
			if (sum > 1LL * t[i].b)
				break;
		}
		puts(i == n ? "Yes" : "No");
	}
	return 0;
}

3.给一个树,节点1-n,点1是黑色点n是白色其他无色,2个人轮流操作博弈,1号每轮选一个黑色点,染黑相邻无色的点,2号每轮选白点同样操作。(选的点必须有相邻的无色点)第一个操作不了的人输。问这场博弈谁赢...范围1e5
反正是树,就当做1是根节点。所以白色能染最高的白色点下的所有点,黑色能染剩下的点,所以关键是白色最高点多高,所以开局双方都在1-n的最短路上染,染相邻了局势就定了。
然后根据这个局势,算出来黑白能染色几次,染色多的赢。
分分钟口头ac..代码写了至少40分钟..写的非常难看,删删改改的..感觉有其他方法..
#include <bits/stdc++.h>
using namespace std;
#define LL long long
struct node { int v, ne; }a[200005];
int k;
int h[100005];
int fa[100005];
bool vi[100005];
int color[100005];
int co1, co2;
void add(int u, int v)//初始k=1
{
	a[k].v = v, a[k].ne = h[u], h[u] = k++;
}
void find_fa(int x)
{
	vi[x] = 1;
	for (int i = h[x]; i; i = a[i].ne)
	{
		if (vi[a[i].v] == 0)
			fa[a[i].v] = x, find_fa(a[i].v);
	}
}
int get_dis(int x)
{
	if (fa[x] == 1)
		return 1;
	return get_dis(fa[x]) + 1;
}

void coloring1(int x)
{
	int flag = 0;
	for (int i = h[x]; i; i = a[i].ne)
	{
		int ne = a[i].v;
		if (color[ne] == 0)
		{
			color[ne] = 1;
			flag++;
			coloring1(ne);
		}
	}
	if (flag != 0)
		co1++;
}
void coloring2(int x)
{
	int flag = 0;
	for (int i = h[x]; i; i = a[i].ne)
	{
		int ne = a[i].v;
		if (color[ne] == 0)
		{
			color[ne] = 2;
			flag++;
			coloring2(ne);
		}
	}
	if (flag != 0)
		co2++;
}
int get_fa(int x, int count)
{
	if (count == 0)
		return x;
	return get_fa(fa[x], count - 1);
}
int main()
{
	int i, j;
	int n;
	scanf("%*d");
	while (~scanf("%d", &n))
	{
		k = 1;
		memset(h, 0, sizeof(h));
		memset(fa, 0, sizeof(fa));
		memset(vi, 0, sizeof(vi));
		memset(color, 0, sizeof(color));
		for (i = 1; i < n; i++)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			add(x, y);
			add(y, x);
		}
		find_fa(1);
		int dis = get_dis(n);
		int fa2 = get_fa(n, (dis - 1) / 2);
		co1 = 0, co2 = 0;
		color[1] = 1, color[n] = 2;
		int it = n;
		for (i = 0; i < (dis - 1) / 2; i++)
		{
			color[fa[it]] = 2;
			it = fa[it];
		}
		coloring1(1);
		for (i = 1; i <= n; i++)
		{
			if (color[i] == 2)
				coloring2(i);
		}
		puts(co2 <= co1 ? "niuniu" : "niumei");
	}
	return 0;
}












#题解##笔试题目##百度#
全部评论
大佬
点赞 回复
分享
发布于 2019-09-17 21:13
又是你,大佬!!
点赞 回复
分享
发布于 2019-09-17 21:16
联想
校招火热招聘中
官网直投
太强了
点赞 回复
分享
发布于 2019-09-17 21:24
你真是大佬 你竟然没offer 我实在是不敢相信
点赞 回复
分享
发布于 2019-09-17 21:27
膜拜大佬
点赞 回复
分享
发布于 2019-09-17 21:34
第一题可以再详细说一下嘛🤣
点赞 回复
分享
发布于 2019-09-17 22:05
请问 大佬 ,第二题我为啥 输入两组数字就输出了
点赞 回复
分享
发布于 2019-09-18 17:49
我第3题走两遍dfs,看哪个染色多就是哪个赢,就过了🤣
点赞 回复
分享
发布于 2019-09-21 00:27

相关推荐

6 23 评论
分享
牛客网
牛客企业服务