百度2021校招C++/PHP研发工程师笔试卷(9月3日)

第一道 暴力
// 暴力
#include <bits/stdc++.h>
using namespace std;

int main() {
	int T, L, n;
	cin >> T;
	while (T--) {
		cin >> L >> n;
		vector<int> left(n);
		vector<int> right(n);
		for (int i = 0; i < n; ++i) {
			cin >> left[i];
			cin >> right[i];
		}
		vector<int> res(L + 1, 0);
		for (int i = 0; i < n; ++i) {
			for (int j = left[i]; j <= right[i]; ++j) {
				++res[j];
			}
		}
		for (int i = 1; i <= L; ++i) {
			cout << res[i] << " ";
		}
		cout << endl;
	}	
}

第二道 双指针
// 双指针
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PAIR;

bool cmp(const PAIR& p1, const PAIR& p2) {
	return p1.first < p2.first;
}

int main() {
	int T, n, m;
	cin >> T;
	while (T--) {
		cin >> n >> m;
		vector<PAIR> a(n);
		vector<PAIR> b(m);
		int t;
		for (int i = 0; i < n; ++i) {
			cin >> t;
			a[i] = {t, i};
		}
		for (int i = 0; i < m; ++i) {
			cin >> t;
			b[i] = {t, i};
		}
		sort(a.begin(), a.end(), cmp);
		sort(b.begin(), b.end(), cmp);

		vector<int> res(n, -1);
		int i = 0, j = 0;
		while (i < n && j < m) {
			while (j < m && a[i].first > b[j].first)
				++j;
			if (j == m)
				break;
			res[a[i].second] = ++b[j].second;
			++i;
			++j;
		}
		for (int i = 0; i < n; ++i) {
			cout << res[i] << " ";
		}
		cout << endl;
	}	
}

第三道 dfs + 状态保存(可以替换成动态规划)
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;

// n: 台阶总数
// m: 单步跨越最多m级台阶
int n, m;
int dfs(int pre2, int pre1, int r, vector<vector<vector<int>>>& dp) {
	if (r == 0)
		return 1;
	if (r < 0)
		return 0;
	if (dp[pre2][pre1][r] != -1)
		return dp[pre2][pre1][r]; 
	int res = 0;
	for (int i = 1; i <= min(m, r); ++i) {
		if (i != pre1 && i != pre2) {
			res = (res + dfs(pre1, i, r - i, dp)) % mod;
		}
	}
	return dp[pre2][pre1][r] = res;
}

int main() {
	cin >> n >> m;
	vector<vector<vector<int>>> dp(m + 1, vector<vector<int>>(m + 1, vector<int>(n + 1, -1)));
	cout << dfs(0, 0, n, dp) << endl;
    return 0;
}


#百度笔试##笔试题型##百度#
全部评论
第三题写个cout<<2<<endl;还能10%,我佛了
2 回复 分享
发布于 2020-09-03 21:16
大佬
1 回复 分享
发布于 2020-09-03 21:08
大佬
点赞 回复 分享
发布于 2020-09-03 21:06
大佬
点赞 回复 分享
发布于 2020-09-03 21:07
这第三题能过吗,,不超时
点赞 回复 分享
发布于 2020-09-03 21:08
大佬,学习了
点赞 回复 分享
发布于 2020-09-03 21:10
tql
点赞 回复 分享
发布于 2020-09-03 21:11
第二题我感觉和lz写的一模一样,但是我0%
点赞 回复 分享
发布于 2020-09-03 21:12
看不明白😥
点赞 回复 分享
发布于 2020-09-03 21:14
第三题,没想到三维保存状态,暴力的只过了百分之40😞
点赞 回复 分享
发布于 2020-09-03 21:14
这样输出,最后不会多一个空格么?
点赞 回复 分享
发布于 2020-09-03 21:15
第二题用的multimap容器自动排序
点赞 回复 分享
发布于 2020-09-03 21:22
不知道为什么我第二题老是不能通过 #include<cstdio> #include<vector> using std::vector; #include<map> using std::multimap; int main() { int T=1; scanf("%d", &T); for (int t = 0; t != T; ++t) { int n = 3, m = 6; scanf("%d %d", &n, &m); multimap<int, int> a,b; int hope = 0; for (int i = 0; i != n; ++i) { scanf("%d", &hope); a.emplace(hope, i); } int real = 0; for (int i = 0; i != m; ++i) { scanf("%d", &real); b.emplace(real, i); } vector<int>ret(n, -2); for (auto& pr : a) { if (b.empty()) break; int tar = pr.first; auto it = b.upper_bound(tar); if ((--it)->first == pr.first) { ret[pr.second] = it->second; b.erase(it); } else { ++it; if (it == b.cend()) { ret[pr.second] = -2; break; } else { ret[pr.second] = it->second; b.erase(it); } } } for (auto& i : ret) printf("%d ", i + 1); printf("\n"); } return 0; }
点赞 回复 分享
发布于 2020-09-03 21:33
第二题同样的操作,我从尾开始满足起,0%,可惜。
点赞 回复 分享
发布于 2020-09-03 21:33
所以第二题是最后一个数后面还要加一个空格再换行?😰
点赞 回复 分享
发布于 2020-09-03 21:39

相关推荐

10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
评论
1
9
分享
牛客网
牛客企业服务