美团笔试(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;
}
#美团笔试#
查看19道真题和解析