2021年美团笔试第9场

题库链接

1.买蛋糕
(1)题目分析
背景描述:客户要买特定重量的蛋糕,并且这个重量是考好的最重和最轻的。
输入:每天能考的蛋糕数n,已经考好的蛋糕数m,顾客要求的蛋糕质量a,b,已经烤好的蛋糕质量。
输出:小团能否满足顾客需求。
问题类型:多条件判断问题;元素排序问题
(2)步骤
a.读取输入数据n,m,a,b;
b.读取m个值;
c.将m个值排序
d.将m个值的两端值与a,b进行比较
情况一:最大或最小值不在[b,a]中,wrong;
情况二:最大最小值在[b,a]之中,添加a,b通过数组长度来判断是否符合要求

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//题目中貌似默认n >= 2,m <= n;
int main(){
    int n = 0;
    int m = 0;
    int a = 0 ;
    int b = 0;
    
    //先完成数据的输入输出
    while(cin>>n>>m>>a>>b){
        //对不保证a,b大小的处理,s使a是最小值,b是最大值
        if(a<b){
            swap(a,b);
        }
        //定义一个容器,并用已经烤好蛋糕的值对其进行初始化
        vector<int> weight(m,0);
        for(int i=0;i<m;i++){
            cin>>weight[i];
        }
        //对容器中的元素进行排序
        sort(weight.begin(),weight.end());
        if(weight[0]<b||weight.back()>a){
            cout<<"NO"<<endl;
        }
        if(weight[0]!=b){
            weight.insert(weight.begin(),b);
        }
        if(weight.back()!=a){
            weight.insert(weight.end(),a);
        }
        if(weight.size()>n){
            cout<<"NO"<<endl;
        }else{
            cout<<"YES"<<endl;
        }
        return 0;
    }
}

2.综艺节目策划
(1)题目分析
背景描述:设计晋级规则,游戏环节中每个人最后都会得到一个分数score_i,
输入:参加本环节的人数n,和计划晋级的人数x
输出:实际晋级人数
(2)代码实现
步骤
a.定义输入输出变量
b.对数组进行排序
c.对数组进行遍历,统计晋级人数

#include<bits/stdc++.h>
using namespace std;
//一个比较大小的子函数,在排序算法里使用
int cmp(int a,int b)
{
	return a>b;
}
int main()
{ 
	//n为实际人数,x为计划晋级人数,ps为最后通过的人数
    int n,x,ps=0;
    cin>>n>>x;
    //定义一个数组记录每个的得分情况
    int arr[n];
	for(int i=0;i<n;i++)cin>>arr[i]; 
    //对数组中的元素进行排序
	sort(arr,arr+n,cmp); 
    //遍历数组统计晋级人数
	for(int i=0;i<n;i++) 
	{ //if(ps==x) break;
		if((arr[i]>=arr[x-1])&&(arr[i]!=0)) ps++;
	}
	cout<<ps<<endl;
 

3.吃寿司
(1)题目分析
背景描述:N盘寿司围成一圈,每盘寿司对应一个喜好值,选择连续若干盘寿司,使得美味值最大。
输入:N,A[i]寿司数量和每盘寿司的喜好值;T表示输出数据组数
输出:美味值的最大和
问题类型:环形数组中,求子数组的最大和问题
参考链接
主要理解点:最大数组不包含两端,则为常规数组最大子序列和;如果数组包含两端,则最小序列和不包含两端,用数组总和-最小子序列和。
(2)步骤
a.定义变量,读取输入数据
b.动态归化求解普通数组中的最大子序列和以及最小子序列和问题
c.遍历数组的同时求整个数组的和
d.最终结果为普通数组中最大子序列和以及整个数组和-最小子序列和的问题

#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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值