百度开发笔试题解
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; }