美团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的求指导一下
#美团笔试#
全部评论
有一个问题,本地测试通过,但是上传代码测试用例通过率为0是什么原因呀???
点赞 回复 分享
发布于 2022-08-14 16:32
HashMap存储3aj-ai值的个数 然后遍历下标k 从Hashmap中取ak的个数,累加,最后在以0到k-1为下标i k为下标j 更新hashmap 的值 时间复杂度on
1 回复 分享
发布于 2022-08-14 14:38

相关推荐

09-25 10:34
东北大学 Java
多面手的小八想要自然醒:所以读这么多年到头来成为时代车轮底下的一粒尘
点赞 评论 收藏
分享
1 9 评论
分享
牛客网
牛客企业服务