美团8.19 ak
不保证代码能跑,代码是从clion的历史版本扒出来的不一定是最后提交的版本
第一题,忘了,文件也找不到了pass
第二题,
#include<iostream>
#include "algorithm"
#define ll long long
using namespace std;
int main(){
ll n;
cin>>n;
ll sum = 0;
ll* values = new ll[n];
for(int i = 0 ; i < n; ++i){
cin >> values[i];
sum += values[i];
}
ll maxgain = 0;
for(int i = 0 ; i < n - 1 ; ++i){
ll gain = values[i]*values[i+1] - values[i] - values[i+1];
maxgain = max(maxgain, gain);
}
cout<<sum + maxgain<<endl;
}
第三题,注意到合法的串只能是010101或者101010就很简单
#include<iostream>
#include "algorithm"
#include "string"
#define ll long long
#include "vector"
using namespace std;
int main(){
string s;
cin >> s;
ll count = 0;
ll size = s.size();
vector<vector<ll>> dp1(size, vector<ll>(size, 0));
vector<vector<ll>> dp2(size, vector<ll>(size, 0));
for(int i = 0 ; i < size ; ++i){
if(i%2 == 1){
if(s[i] == '0'){
dp1[i][i] = 1;
}else{
dp2[i][i] = 1;
}
}else{
if(s[i] == '1'){
dp1[i][i] = 1;
}else{
dp2[i][i] = 1;
}
}
}
for(int i = 0 ; i < size; ++i){
for(int j = i+1 ; j < size; ++j){
if(j%2 == 0){
if(s[j] == '1'){
dp1[i][j] = dp1[i][j-1] + 1;
dp2[i][j] = dp2[i][j-1];
}else{
dp2[i][j] = dp2[i][j-1] + 1;
dp1[i][j] = dp1[i][j-1];
}
}else{
if(s[j] == '1'){
dp2[i][j] = dp2[i][j-1] + 1;
dp1[i][j] = dp1[i][j-1];
}else{
dp1[i][j] = dp1[i][j-1] + 1;
dp2[i][j] = dp2[i][j-1];
}
}
count += min(dp1[i][j], dp2[i][j]);
}
}
cout << count;
return 0;
}
第四题,dp,前i位分配j个有多少种分配方法
#include "iostream"
#include "vector"
#define ll long long
#define base 1000000007
using namespace std;
int main(){
int n;
cin >> n;
int* a = new int[n];
int suma = 0;
for(int i = 0 ; i < n ; ++i){
cin >> a[i];
suma += a[i];
}
vector<vector<ll>> dp(n, vector<ll>(suma+1, 0));
for(int i = 1 ; i < suma; ++i){
if(i!=a[0])
dp[0][i] = 1;
}
for(int i = 1; i < n; ++i){
for(int j = i + 1; j <= suma; ++j){
ll count = 0;
for(int front = 1; front < j; ++front){
if(j - front != a[i])
count = (count + dp[i-1][front]) % base;
}
dp[i][j] = count;
}
}
cout << dp[n-1][suma];
}
第五题,分类讨论,能平均就得把所有数据变成一样的,不能平均就需要舍弃一个,把其余的变成一样的,舍弃的应当是最大值或者最小值,剩余的数字变成剩余数字的平均值(向下取整以及向下取整加一都有可能)
#include<iostream>
#include "algorithm"
#include "string"
#define ll long long
#include "vector"
using namespace std;
int main(){
int n;
cin >> n;
vector<ll> a(n, 0);
ll ssum = 0;
for(int i = 0 ; i < n ; ++i){
cin >> a[i];
ssum += a[i];
}
ll count = 0;
if(ssum % n == 0){
ll avg = ssum / n;
for(auto it: a){
if(it > avg){
count += (it - avg);
}
}
cout << count << endl;
}else{
// 需要抛弃一个值
ll toPrint;
sort(a.begin(), a.end());
//放弃第一个
ll sumWithoutFirst = 0;
for(int i = 1 ; i < n; ++i){
sumWithoutFirst += a[i];
}
ll newAvg = sumWithoutFirst / (n-1);
ll changeNeg = 0, changePos = 0;
for(int i = 1 ; i < n; ++i){
if(a[i] > newAvg){
changePos += (a[i]-newAvg);
}else{
changeNeg += (newAvg - a[i]);
}
}
toPrint = max(changeNeg, changePos);
changeNeg = 0, changePos = 0;
newAvg ++;
for(int i = 1 ; i < n; ++i){
if(a[i] > newAvg){
changePos += (a[i]-newAvg);
}else{
changeNeg += (newAvg - a[i]);
}
}
toPrint = min(toPrint, max(changeNeg, changePos));
// 抛弃最后一个
ll sumWithoutLast = 0;
for(int i = 0 ; i < n-1; ++i){
sumWithoutLast += a[i];
}
newAvg = sumWithoutLast / (n-1);
changeNeg = 0, changePos = 0;
for(int i = 0 ; i < n-1; ++i){
if(a[i] > newAvg){
changePos += (a[i]-newAvg);
}else{
changeNeg += (newAvg - a[i]);
}
}
toPrint = min(toPrint, max(changeNeg, changePos));
newAvg++;
changeNeg = 0, changePos = 0;
for(int i = 0 ; i < n-1; ++i){
if(a[i] > newAvg){
changePos += (a[i]-newAvg);
}else{
changeNeg += (newAvg - a[i]);
}
}
toPrint = min(toPrint, max(changeNeg, changePos));
cout<<toPrint;
}
}
#美团笔试#
查看23道真题和解析