美团2021校招笔试-编程题(通用编程试题,第9场)

在这里插入图片描述
第一题题目没看懂

团的蛋糕铺长期霸占着美团APP中“蛋糕奶茶”栏目的首位,因此总会吸引各路食客前来探店。

小团一天最多可以烤n个蛋糕,每个蛋糕有一个正整数的重量。

早上,糕点铺已经做好了m个蛋糕。

现在,有一个顾客要来买两个蛋糕,他希望买这一天糕点铺烤好的最重的和最轻的蛋糕,并且希望这两个蛋糕的重量恰好为a和b。剩余的n-m个蛋糕可以现烤,请问小团能否满足他的要求

按答案意思是顾客的要求是已经烤好的m个蛋糕的重量应该介于a\b之间。
关键理解n是什么作用,n-m是现烤的,现烤的是完全可以满足要求的,如果烤好的已经超过了的话,就得返回false了。

抄了份题解

/*
20:46
总共n个,已有m个,a最重b最轻
已有的蛋糕数量已知
首先,要买最重和最轻。如果a,b在已有蛋糕重量中不是最重和最轻,则无法满足
设还可以烤k个蛋糕,k=n-m.

如果n < 2,pass,no

如果n >= 2:
m == 0, 则k = 2,yes
m == 1:
如果这个蛋糕=a或=b, k >= 1,yes
如果这个蛋糕b<蛋糕<a,我们需要自己做a,b,此时如果k>=2,yes
m >= 2:
如果所有蛋糕都在[b,a],且有a也有b,yes
如果所有蛋糕都在(b,a),我们要自己做a,b. 若k>=2,yes
以上,把n和m所有可能的情况都考虑到了,再加上a和b比较大小这种坑b条件
*/






#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, m, a, b;
    while(~scanf("%d%d%d%d",&n,&m,&a,&b))
    {
        bool f = 0;
        int k = n-m;
        if(a < b) swap(a,b); //**条件
        if(n >= 2)
        {
            if(m == 0) f = 1;
            else if(m == 1)
            {
                int x;
                scanf("%d",&x);
                if((x == a || x == b) && k >= 1) f = 1;
                if(x > b && x < a && k >= 2) f = 1;
            }
            else
            {
                int Max, Min;
                for(int i = 0;i < m;i++)
                {
                    int x;
                    scanf("%d",&x);
                    if(i == 0) Min = x, Max = x;
                    Min = min(Min,x);
                    Max = max(Max,x);
                }
                if(Min == b && Max == a) f = 1;
                if(Min >= b && Max <= a && k >= 2) f = 1;
            }
        }
        if(f) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

第二题感觉能做出来,没集中精力,
小团是某综艺节目的策划,他为某个游戏环节设计了一种晋级规则,已知在这个游戏环节中每个人最后都会得到一个分数score_i,显而易见的是,游戏很有可能出现同分的情况,小团计划该环节晋级人数为x人,则将所有人的分数从高到低排序,所有分数大于等于第x个人的分数且得分不为0的人都可以晋级。

请你求出本环节的实际晋级人数。显然这个数字可能是0,如果所有人的得分都是0,则没有人满足晋级条件。
错误代码:没有考虑第x个人分数重复会有多个,所以是可能大于x的

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n,x;
    cin >> n >> x;
    vector <int> scores(n);
    for(int  i = 0;i < n;i++)
    {
        int score;
        cin >> score;
        scores[i] = score;
    }
    sort(scores.begin(),scores.end(),greater<int>());
    int res = 0;
    while(res < x)
    {
        //cout << scores[res] <<endl;
        if(scores[res] == 0)
        {
            break;
        }
        res++;
    }
    cout << res << endl;
    return 0;
}

正确代码:做了简单的修改,

if(res >= x && scores[res] != scores[x-1])
        {
            break;
        }

把等于的那种情况排除出去

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n,x;
    cin >> n >> x;
    vector <int> scores(n);
    for(int  i = 0;i < n;i++)
    {
        int score;
        cin >> score;
        scores[i] = score;
    }
    sort(scores.begin(),scores.end(),greater<int>());
    int res = 0;
    while(res < n)
    {
        if(res >= x && scores[res] != scores[x-1])
        {
            break;
        }
        //cout << scores[res] <<endl;
        if(scores[res] == 0 )
        {
            break;
        }
        res++;
    }
    cout << res << endl;
    return 0;
}

小美请小团吃回转寿司。转盘上有N盘寿司围成一圈,第1盘与第2盘相邻,第2盘与第3盘相邻,…,第N-1盘与第N盘相邻,第N盘与第1盘相邻。小团认为第i盘寿司的美味值为A[i](可能是负值,如果小团讨厌这盘寿司)。现在,小团要在转盘上选出连续的若干盘寿司,使得这些寿司的美味值之和最大(允许不选任何寿司,此时美味值总和为0)。

输入描述:
第一行输入一个整数T(1<=T<=10),表示数据组数。

每组数据占两行,第一行输入一个整数N(1<=N<=10^5);

第二行输入N个由空格隔开的整数,表示A[1]到A[N](-104<=A[i]<=104)。

输出描述:
每组数据输出占一行,输出一个整数,表示连续若干盘寿司的美味值之和的最大值。

输入例子1:
1
4
3 -2 4 -1

输出例子1:
6

#include <bits/stdc++.h>
using namespace std;
int main(){
    int T,N;
    cin>>T;
    for(int i=0;i<T;i++){
        cin>>N;
        int Max=INT_MIN,Min=INT_MAX,res;
        vector<int> arr(N);
        for(int i=0;i<N;i++){
            cin>>arr[i];
        }
        int total=0;
        vector<int>dpMax(N);
        vector<int>dpMin(N);
        dpMax[0]=dpMin[0]=arr[0];
        total+=arr[0];
        //分析,最大值为单个序列最大或是首尾相连(总和减去最小值),取两者最大
        for(int i=1;i<N;i++){
            total+=arr[i];
            dpMax[i]=max(dpMax[i-1]+arr[i],arr[i]);
            dpMin[i]=min(dpMin[i-1]+arr[i],arr[i]);
            if(Max<dpMax[i]) Max=dpMax[i];
            if(Min>dpMin[i]) Min=dpMin[i];
        }
        res = max(Max,total-Min);
        cout<<res<<endl;
    }
        return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值