美团8.13后端笔试题cpp复盘
1、魔法外卖
解法:贪心,配送时间小于订单超时时间就可以不使用魔法,AC
代码:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n, t; cin >> n >> t; // n为订单数,t为每单派送时间 int num; vector<int> nums(n); // n个订单的超时时间 for(int i = 0; i < n; ++i) { cin >> num; nums[i] = num; } sort(nums.begin(), nums.end()); int count = 0; // 最少使用几次魔法 int time = 0; // 配送花费总时间 for(int i = 0; i < n; ++i) { if(t + time <= nums[i]) { // 时间小于等于超时时间则不需要使用魔法 time += t; } ++count; } cout << count << endl; return 0; }2、扫地机器人
解法:力扣岛屿问题变种,AC
代码:
#include<iostream> #include<vector> #include<algrithm> using namespace std; int main() { int n, m, k; // n*m房间,k长度指令字符串,均为大写 cin >> n >> m >> k; string str; cin >> str; vector<vector<bool>> map(n, vector<bool>(m, false)); int x = 0, y = 0; map[x][y] = true; int clean = 1; // 记录已清理的数量 int i; for(i = 0; i < k; ++i) { if(str[i] == 'W') { // 上 if(x > 0) { --x; } } if(str[i] == 'S') { // 下 if(x + 1 < n) { ++x; } } if(str[i] == 'A') { // 左 if(y > 0) { --y; } } if(str[i] == 'D') { // 右 if(y + 1 < m) { ++y; } } if(map[x][y] == false) { ++clean; map[x][y] = true; } if(clean == n * m) break; } if(clean == n * m) { cout << "Yes" << endl; cout << i + 1; } else { cout << "No" << endl; cout << n * m - clean; } return 0; }3、扑克
解法:双端队列,反向推导,AC
代码:
#include<iostream> #include<algorithm> #include<vector> #include<deque> using namespace std; int main() { int n; // n张牌 cin >> n; vector<int> nums(n); int num; for(int i = 0; i < n; ++i) { cin >> num; nums[i] = num; } deque<int> myDeque; for(int i = n - 1; i >= 0; --i) { myDeque.push_front(nums[i]); int people = 2; while(people--) { myDeque.push_front(myDeque.back()); myDeque.pop_back(); } } for(const auto& it : myDeque) { cout << it << " "; } return 0; }4、合法元数组
解法:回溯,通过82,部分超时
代码:
#include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int> path; void backtracing(vector<int>& nums, int startIndex, int& ans) { if(path.size() > 3) return; if(path.size() == 3) { if((path[0] - path[1]) - (2 * path[1] - path[2]) == 0) { ++ans; } return; } for(int i = startIndex; i < nums.size(); ++i) { path.push_back(nums[i]); backtracing(nums, i + 1, ans); path.pop_back(); // 回溯 } } int main() { int n; // 序列长度 cin >> n; vector<int> nums(n); int num; for(int i = 0; i < n; ++i) { cin >> num; nums[i] = num; } int ans = 0; backtracing(nums, 0, ans); cout << ans << endl; return 0; }5、生活在树上
解法:数组当树然后遍历,AC
代码:
#include<iostream> #include<algorithm> #include<vector> using namespace std; int traversal(vector<int>& nums, int index, int length) { if(index >= length) return 0; int l = traversal(nums, 2 * index, length) + nums[index]; // 左子树 int r = traversal(nums, 2 * index + 1, length) + nums[index]; // 右子树 return max(l, r); } int main() { int n; // 序列长度 cin >> n; vector<int> nums(n + 1); nums[0] = 0; int num; for(int i = 1; i < n + 1; ++i) { cin >> num; nums[i] = num; } int res = traversal(nums, 1, nums.size()); cout << res << endl; return 0; }有没有大佬第四题ac的求指导一下