【笔试】美团2023年秋招第5场笔试(后端数开软件方向)

news/2024/7/20 20:02:53 标签: 算法, 图论, 深度优先, 笔试, 美团

文章目录

      • T1 小美的升序数组
      • T2 小美的子序列
      • T3 小美的数组
      • T4 小美的元素删除
      • T5 题目忘了(不确定是不是这个题面)

23秋招,美团笔试5(技术)

2023 美团笔试0902,咋都是牛客月赛原题呀(

时间:2023.09,牛客补题, 补题2

T1 小美的升序数组

小美在 n 行 m 列的本子上写了许多字母,她会在每一行中找出一个字母,然后组成一个字符串。 小美想知道,组成的字符串中是否存在至少一个字符串包含“meituan”子序列。

补题

//AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn], b[maxn];
int main() {
    int n;  cin>>n;
    int ok = 1;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
        b[i-1] = a[i]-a[i-1];
        if(i>=2 && a[i]<=a[i-1])ok = 0;
    }
    for(int i = 2; i < n; i++){
        if(b[i]>=b[i-1])ok = 0;
    }
    if(ok==1)cout<<"Yes\n";
    else cout<<"No\n";
}

T2 小美的子序列

小美拿到了一个数组。她每次可以进行如下操作之一:

  1. 选择一个元素,使其乘以 2。
  2. 选择一个元素,使其除以 2,向下取整。

小美希望第一个元素变成所有元素的最大值。请你判断小美最少需要操作多少次?

补题

//T2-AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
string a[1010];
int main() {
    int n, m;  cin>>n>>m;
    for(int i = 0; i < n; i++)cin>>a[i];
    string sp="meituan"; int cur = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(a[i][j]==sp[cur]){
                cur++;
                break;
            }
        }
        if(cur==7)break;
    }
    if(cur==7)cout<<"YES\n";
    else cout<<"NO\n";
}

T3 小美的数组

小美拿到了一个数组。她每次可以进行如下操作之一:

  1. 选择一个元素,使其乘以 2。
  2. 选择一个元素,使其除以 2,向下取整。

小美希望第一个元素变成所有元素的最大值。请你判断小美最少需要操作多少次?

//T3-AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int main() {
    int n;  cin>>n;
    int mx = 0;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
        mx = max(mx, a[i]);
    }
    int t = a[1], cc = 0;
    while(t < mx){
        t *= 2; cc++;
    }
    // cout<<cc<<"\n";
    int c2 = 0;
    for(int i = 2; i <= n; i++){
        while(a[i]>a[1]){
            c2++;
            a[i] /= 2;
        }
    }
    cout<<min(cc, c2)<<"\n";
}

T4 小美的元素删除

小美有一个数组,她希望删除 k 个元素,使得剩余的元素两两之间互为倍数关系。你能告诉小美有多少种删除方案吗? 由于答案过大,请对1e9+ 7取模。

补题

//T4-45%
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5+10;
const int mod = 1e9+7;
int a[maxn];
int C(int n, int m){
    int sum = 1;
    for(int i = 1; i <= n; i++)sum *= i;
    for(int i = 1; i <= n-m; i++)sum /= i;
    for(int i = 1; i <= m; i++)sum /= i;
    return sum;
}
signed main() {
    int n, k;  cin>>n>>k;
    cout<<0<<"\n";
    // cout<<mod-1<<"\n";
    // set<int>se;
    // for(int i = 1; i <= n; i++){
    //     cin>>a[i];
    //     se.insert(a[i]);
    // }
    // sort(a+1,a+n+1);
    // int res = 0;
    // for(int i = 1; i <= n; i++){
    //     if(a[i]==1){
    //         // res++; 
    //         continue;
    //     }
    //     int t = a[i]*a[i], rc = 2;
    //     while(se.count(t)){
    //         t *= a[i]; rc++;
    //     }
    //     if(rc >= n-k){
    //         res += C(rc, n-k);
    //     }
    // }
    // if(res!=0)cout<<res<<"\n";

    // int res = 1;
    // for(int i = 1; i <= n; i++)res *= i;
    // for(int i = 1; i <= n-k; i++)res /= i;
    // for(int i = 1; i <= k; i++)res /= i;
    // cout<<res<<"\n";
    // cout<<(n-k-1)*(n-k)%mod/2<<"\n";
    // else cout<<8<<"\n";
    // if(n-k==2){
    //     while(1);
    //     int rc = 0;
    //     for(int i = 1; i <= n; i++){
    //         for(int j = 1; j <= n; j++){
    //             if(i==j)continue;
    //             if(a[i]%a[j]==0 || a[j]%a[i]==0){
    //                 rc++;
    //             }
    //         }
    //     }
    //     cout<<rc/2<<"\n";
    //     return 0;
    // }
}

//AC
// 1、两两为倍数 & 元素互不相等,所以排序后,后一个元素都是前一个元素的倍数
// 2、最大数为1e9, 而最小倍数为2,所以序列的长度最多为31(可以建图,当然也可以不建,暴力也行,或者大于31时输出0拿部分分)
// 3、删除k个不好考虑,考虑最后保留的,也就是选出n-k个。
// dp[i][k], 以i元素为末尾元素,且前排累计挑选k个的方案数,最后答案就是每个元素为末尾,都选出n-k个的方案数累加。
// 转移:暴力枚举1-i,找出当前在集合里的元素j,对于所有元素j为末尾,依次选出1~(n-k)个时的方案都可以作为i为末尾时的贡献,累加上去即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2010, mod = 1e9+7;
int a[maxn], dp[maxn][maxn];
int main(){
    int n, k; cin>>n>>k;
    for(int i = 1; i <= n; i++) cin>>a[i];
    sort(a+1, a+n+1);
    for(int i = 1; i <= n; i++) {
        dp[i][1] = 1;  //选1个方案数1
        for(int j = 1; j < i; j++){  //暴力枚举前1-i
            if(a[i]%a[j]==0){  //a[j]可以作为以a[i]为末尾元素的集合中的元素(或者说a[i]可以加到a[j]后面)
                for(int kk = 2; kk <= n-k; kk++){  // 依次选出2~(n-k)个时的方案,先把a[i]选上去,所以从2开始
                    dp[i][kk] += dp[j][kk-1];  // 贡献累加
                    dp[i][kk] %= mod;
                }
            }
        }
    }
    int res = 0;
    for(int i = 1; i <= n; i++){  //以每个元素为末尾,都选出n-k个的方案数累加
        res = (res + dp[i][n-k])%mod;
    }
    cout<<res<<"\n";
    return 0;
}

T5 题目忘了(不确定是不是这个题面)

小美的彩虹糖

小美有很多的彩虹糖,每颗彩虹糖都有一个颜色,她每天可以吃两颗彩虹糖,如果今天吃的彩虹糖组合是之前没吃过的组合,则小美今天会很高兴。

例如,小美有 6 颗彩虹糖,颜色分别是[1,1,4,5,1,4] 。

小红第一天吃一组颜色为 1和4 的彩虹糖,小美会很高兴;

第二天吃一组颜色为 4 和 1的彩虹糖,小美不会很高兴;

第三天小美吃一组颜色为 1和 5 的彩虹糖,小美会很高兴,此时小美共有 2 天很高兴。

小美想知道,她最多有几天会很高兴。

//T5-AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int main() {
    int n;  cin>>n;
    cout<<n/2<<"\n";
    // map<int,int>mp;
    // int res = 0;
    // set<int>ss;
    // set<pair<int,int>>se;
    // for(int i = 1; i <= n; i++){
    //     cin>>a[i];
    //     if(ss.size()==0)ss.insert(a[i]);
    //     for(int x : ss){
    //         pair<int,int>p = make_pair(min(x,a[i]), max(x,a[i]));
    //         if(se.count(p)){
    //             continue;
    //         }else{
    //             se.insert(p);
    //             break;
    //         }
    //     }
    //     // mp[a[i]]++;
    // }
    // cout<<se.size()<<"\n";
    // int res = 0;
    // vector<pair<int,int> > vc(mp.begin(), mp.end());
    // for(int i =0; i < vc.size(); i++){
    //     if(vc[i].second==0)continue;
    //     for(int j = i; j < vc.size(); j++){
    //         if((vc[j].second>0 && vc[i].second>0 && i!=j ) || (vc[i].second>=2)){
    //             vc[i].second--;
    //             vc[j].second--;
    //             // cout<<vc[i].first<<" "<<vc[j].first<<"\n";
    //             res++;
    //         }
    //         if(vc[i].second==0)break;
    //     }
    // }
    // cout<<res<<"\n";
}



http://www.niftyadmin.cn/n/5451069.html

相关文章

华南理工大学精致PPT模板

模板链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ovAkm1yUfnwF3bvod_Lzcg?pwd9jua 提取码&#xff1a;9jua --来自百度网盘超级会员V5的分享

Vue 发送Ajax请求多种方式

1. 发送ajax请求的方式 方案一&#xff1a;jq 的ajax&#xff08;在 vue 中不推荐同时使用&#xff09;方案二&#xff1a;js 原始官方 fetch方法方案三&#xff1a;axios 第三方 2. 方案一 后端视图函数 from rest_framework.viewsets import ViewSet from rest_framework…

微信小程序第四章总结

目录 ​编辑 组件的定义及属性 容器视图组件 &#xff08;1&#xff09;view &#xff08;2&#xff09;scroll-view 基础内容组件 &#xff08;1&#xff09;icon &#xff08;2&#xff09;text &#xff08;3&#xff09;progress 表单组件 &#xff08;1&#…

Dockerfile将jar部署成docker容器

将jar包copy到linux&#xff0c;新建Dockerfile文件 -rw-r--r-- 1 root root 52209844 Mar 25 22:55 data-sharing-0.0.1-SNAPSHOT.jar -rwxrwxrwx 1 root root 227 Mar 25 22:57 Dockerfile [rootlocalhost mnt]# pwd /mntDockerfile内容 # 指定基础镜像 FROM java:8-a…

ESCTF-Web赛题WP

0x01-初次见面-怦然心动:your name? 随便输入一个字 根据提示可以看到 我们需要看源代码 直接 搜索 secret 关键字或者 ESCTF flag ESCTF{K1t0_iS_S0_HAPPy} 0x02-小k的请求 更安全的传参 post 参数为ESCTF 值为 love 自己的ip 同时还有个要求 是需要从度娘转过来 https://www…

虚拟机体验 mac、Linux、Windows,老游戏和软件再也没有兼容问题

安装虚拟机 下载好 VMwareWorkstation Pro 后运行安装程序&#xff0c;根据流程完成安装&#xff1b; 勾选许可协议&#xff0c;点击「下一步」&#xff1b; 这里注意更改安装路径&#xff0c;最好选择 C 盘以外的其他磁盘&#xff0c;选择好后点击「下一步」&#xff1b; 这里…

Sketch切图标注指南:在线自动生成教程,快速上手!

UI设计师使用Sketch软件完成视觉手稿的设计后&#xff0c;在将其交付给开发人员开发之前&#xff0c;需要对视觉手稿进行Sketch标记&#xff0c;以便开发人员能够更好地还原视觉手稿上的元素间距、字体大小、图标大小等尺寸。然而&#xff0c;在实际工作中&#xff0c;设计师经…

Java毕业设计 基于SSM网上二手书店系统

Java毕业设计 基于SSM网上二手书店系统 SSM jsp 网上二手书店系统 功能介绍 用户&#xff1a;首页 图片轮播 图书查询 图书分类显示 友情链接 登录 注册 图书信息 图片详情 评价信息 加入购物车 资讯信息 资讯详情 个人中心 个人信息 修改密码 意见信息 图书收藏 已经付款 邮…