2022-08-20 美团笔试
第1题
送分题。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
string a, b;
cin>>n;
cin>>a;
cin>>b;
for(int i = 0; i < n; ++i) {
cout<<a[i]<<b[i];
}
cout<<"\n";
return 0;
}
第2题
3个集合取交集。
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
int main() {
set<pii> st[3];
int n;
int x[3], y[3], d[3];
cin>>n;
for(int i = 0; i < 3; ++i) {
cin>>x[i]>>y[i];
}
for(int i = 0; i < 3; ++i) {
cin>>d[i];
}
for(int i = 0; i < 3; ++i) {
for(int dx = -d[i]; dx <= d[i]; ++dx) {
int xx = x[i] + dx, dy = d[i] - abs(dx);
if(xx < 1|| x[i] > n) {
continue;
}
if(y[i] - dy > 0 && y[i] - dy <= n)
st[i].insert(make_pair(x[i] + dx, y[i] - dy));
if(y[i] + dy > 0 && y[i] + dy <= n)
st[i].insert(make_pair(x[i] + dx, y[i] + dy));
}
}
set<pii> ans1;
set<pii> ans;
set_intersection(st[0].begin(), st[0].end(), st[1].begin(), st[1].end(), inserter(ans, ans.begin()));
set_intersection(st[2].begin(), st[2].end(),ans.begin(), ans.end(), inserter(ans1, ans1.begin()));
cout<<ans1.begin()->first<<" "<<ans1.begin()->second<<"\n";
return 0;
}
第3题
数学题,排序。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
double ans = 0.0;
cin>>n>>m;
vector<double> a(n, 0);
vector<double> p(n, 0);
for(int i = 0; i < n; ++i) {
cin>>p[i];
}
for(int i = 0; i < n; ++i) {
cin>>a[i];
ans += a[i] * p[i] / 100.0;
a[i] *= ((100.0 - p[i]) / 100.0);
}
sort(a.begin(), a.end());
for(int i = 0; i < m; ++i) {
ans += a[n - 1 - i];
}
printf("%.2f\n", ans);
return 0;
}
第4题
动态规划,与最短编辑距离类似。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin>>n>>m;
vector<int> a(n, 0);
vector<int> b(m, 0);
for(int i = 0; i < n; ++i) {
cin>>a[i];
}
for(int i = 0; i < m; ++i) {
cin>>b[i];
}
vector<vector<int>>dp(n + 1, vector<int>(m + 1, 0));
vector<int> sa(n + 1, 0);
vector<int> sb(m + 1, 0);
dp[0][0] = 0;
for(int i = 1; i <= n; ++i) {
sa[i] = abs(sa[i - 1]) + abs(a[i - 1]);
dp[i][0] = sa[i];
}
for(int i = 1; i <= m; ++i) {
sb[i] = abs(sb[i - 1]) + abs(b[i - 1]);
dp[0][i] = sb[i];
}
int ans = 0;
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j) {
dp[i][j] = min(abs(a[i - 1] - b[j - 1]) + dp[i - 1][j - 1], abs(a[i - 1]) + dp[i - 1][j]);
dp[i][j] = min(dp[i][j], abs(b[j - 1]) + dp[i][j - 1]);
}
}
cout<<dp[n][m]<<"\n";
return 0;
}
第5题
双指针,模拟。