美团316笔试3,4题
第三题
当时没做出来,后面听说可以2的幂打表,按这个思路重写了一遍,但是无法验证对不对。求找bug。
#include <iostream> using namespace std; int main() { int n,q; cin >> n >> q; vector<int> arr(n + 1, 0); for (int i = 1; i <= n; i++) { cin >> arr[i]; } vector<int> action(n + 1, q); // 每个元素翻倍了几次 for (int i = 0; i < q; i++) { int tmp; cin >> tmp; action[tmp]--; } vector<int> dir(q + 1, 1); // 2的次方打表 for (int i = 1; i <= q; i++) { dir[i] = dir[i - 1] * 2 % 1000000007; } long outcome = 0; for (int i = 1; i <= n; i++) { outcome += (long)arr[i] * dir[action[i]] % 1000000007; } cout << outcome % 1000000007; }
第四题
通过率70%,不知道怎么优化双指针。
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> arr(n + 1, 0); vector<int> nums_2(n + 1, 0); for (int i = 1; i <= n; i++) { cin >> arr[i]; if (arr[i] == 2) { nums_2[i] = nums_2[i - 1] + 1; } else { nums_2[i] = nums_2[i - 1]; } } int outcome = 0; for (int left = 1; left <= n; left++) { // O(n^2) for (int right = left; right <= n; right++) { int sum_2 = nums_2[right] - nums_2[left - 1]; if (sum_2 > right - (left - 1) - sum_2) { // 如果2的个数多于1的个数 outcome += 2; } else { outcome += 1; } } } cout << outcome; }#美团##美团笔试#