美团笔试(2023 08/26)AK代码
题1(种菜)
算数题。
#include <iostream> using namespace std; int main() { int x, y, z; cin >> x >> y >> z; int d = x * 3 + y; int day = z / d; int res; if (day * d < z) { day++; } if (day * d == z) { res = day * 3; } else { if (day * d - 2 * x >= z) { res = day * 3 - 2; } else if (day * d - x >= z) { res = day * 3 - 1; } else { res = day * 3; } } cout << res; }
题2(结账)
算数题。
#include <iostream> #include <vector> using namespace std; int main() { int n, m; cin >> n >> m; int k, c; vector<long long> C(m, 0); for (int i = 0; i < n; i++) { cin >> k >> c; int p; int cost = c / k; if (cost * k < c) { cost++; } for (int j = 0; j < k - 1; j++) { cin >> p; p--; C[p] += cost; } } for (int i = 0; i < m; i++) { cout << C[i] << ' '; } }
题3(最大数组和)
排序取大的那部分累乘。O(nlogn)。
#include <algorithm> #include <iostream> #include <vector> using namespace std; int main() { int n, k; cin >> n >> k; vector<long long> a(n); for (int i = 0, t; i < n; i++) { cin >> a[i]; } sort(a.begin(), a.end()); long long base = a[n - 1]; int i = n - 2; int m = 0; for (; i >= n - k - 1; i--) { base = (base * a[i]) % (1000000007); m++; } while(i >= 0) { base += a[i]; base %= 1000000007; i--; } base += m; cout << base; }
题4(重排数组,相加后满足约束)
排序后,直接校验约束。O(nlogn)。
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool solve(vector<int> A, vector<int> B, int m) { int n = A.size(); sort(A.begin(), A.end()); sort(B.begin(), B.end()); for (int i = 0; i < n; i++) { int j = n - i - 1; int value = A[i] + B[j]; if (! (value >= 1 && value <= m)) { return false; } } return true; } int main() { int q; cin >> q; for (int v = 0; v < q; v++) { int n, m; cin >> n >> m; vector<int> A(n), B(n); for (int i = 0; i < n; i++) { cin >> A[i]; } for (int i = 0; i < n; i++) { cin >> B[i]; } if (solve(A, B, m)) { cout << "Yes" << endl; } else { cout << "No" << endl; } } }
题5(均值为k的最长子串)
都减去k,计算前缀和存map,再一次遍历查找最远相同前缀和。O(n)。
#include <iostream> #include <unordered_map> #include <vector> using namespace std; int main() { int n, k; cin >> n >> k; vector<int> A(n); for (int i = 0; i < n; i++) { cin >> A[i]; A[i] -= k; } unordered_map<long long, int> m; long long sum = 0; for (int i = 0; i < n; i++) { sum += A[i]; m[sum] = i; } sum = 0; int res = -1; for (int i = 0; i < n; i++) { sum += A[i]; if (sum == 0) { res = i + 1; } else { if (m[sum] > i) { int j = m[sum]; res = max(res, j - i); } } } cout << res; }#美团笔试#