美团笔试2023-08-19
呜呜,太菜了只会三道题;
100% 100% 100% 0% 16.7%
希望能进面试
求佬给个3,4题的思路
1. 最大限制m,求超出m的x,取模即可:
```c++
int q;
cin >> q;
while(q--) {
int m,x;
cin >> m >> x;
int ans = x % m;
if(ans == 0) ans = m;
cout<<ans<<"\n";
```
2. 数组中的数字默认加法,你可以选两个数字,把他俩之间的加法变成乘法;
选则相乘最大的即可:爆int精度用long long即可;
```c++
#include <bits/stdc++.h>
using namespace std;
#define IOS ios_base :: sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)
typedef long long ll;
#define int ll
const int N = 2e5+9;
int a[N];
signed main() {
IOS;
int n;
cin >> n;
for(int i=1; i<=n; i++) {
cin >> a[i];
}
int maxx = 0,pos = -1;
for(int i=1; i<n; i++) {
if(maxx < a[i] * a[i+1]) {
pos = i;
maxx = a[i] * a[i+1];
}
}
int ans = maxx;
for(int i=1; i<=n; i++) {
if(i == pos || i == pos+1) continue;
else ans += a[i];
}
cout<<ans<<"\n";
return 0;
}
```
3 . 给你个字符01串,定义价值为:最少的操作次数使得,0和1不相邻,如:111000101,变成101010101或者010101010两者取最少变化次数的方案即可;n <= 2000
```c++
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e3+9;
char s[N];
int main() {
scanf("%s",s+1);
int len = strlen(s+1);
int ans = 0;
for(int i=1; i<len; i++) {
int sum1 = 0,sum2 = 0;
int s1 = 0,s2 = 0;
for(int j=i; j<=len; j++) {
if(j % 2 == 1) {
if(s[j] == '0') s1++;
if(s[j] == '1') s2++;
} else {
if(s[j] == '1') s1++;
if(s[j] == '0') s2++;
}
ans += min(s1,s2);
}
}
cout<<ans<<"\n";
return 0;
}
```
4.给你一个数组a,求构造出符合条件的数组b的方案数;
条件: a[i] != b[i]即 b中的任何一项不能和a相等;
数组a的和与数组b的和相等,b中的数字全是正整数;
ans对1e9+7取模
写了个爆搜结果0% 。。。
5.把数组中的数字每一项都变为众数所需要的最小次数是多少?
我只想到了,众数的个数是n或n-1,若sum % n == 0就是n,否则变成n-1个1,即可;
求大佬给个4,5题的思路和代码
#美团##美团笔试##笔试#