2022/9/3美团第二次笔试

2022/9/3美团第二次笔试

第一题

乒乓球,被称为中国的“国球”,是一种世界流行的球类体育项目。一局比赛的获胜规则如下:

当一方赢得至少11分,并且超过对方2分及以上时,获得该局的胜利。

按照上述规则,小美和小团正在进行一局比赛,当前比赛尚未结束,此时小美的得分为a,小团的得分为b。小美想知道,在最理想的情况下,她至少还要得多少分才可以赢下这场比赛。

输入两个整数a、b。a表示当前小美获得的分数,b表示小团的分数。

0 ≤ a, b ≤ 99,保证输入的比分合法,并且在该比分下比赛尚未结束。
输出一个整数,表示小美至少还要得多少分才能获得这局比赛的胜利。

样例
30 31
3

0 9
11

直接取b+2与11的较大值即可获胜

#include"bits/stdc++.h"
using namespace std;
int main(){
    int a,b;
    cin >> a >> b;
    int ans = 0;
    ans = max(b + 2, 11);
    
    cout << ans - a << endl;
    return 0;
}

第二题

若S表示一个非负整数集合,mex(S)的值为不属于集合S的最小非负整数。例如,mex({0, 1, 4}) = 2,mex({1, 2}) = 0。

有n个互不相同的非负整数a1, a2, … an 构成了一个非负整数集合A。小美想知道若将ai (1 ≤ i ≤ n)从集合A中删除,
剩下的n-1个数构成的新集合A’的mex值为多少?请输出 i 从1到 n 所有取值下新集合的mex值。

第一行输入一个整数n,表示集合A的大小。

第二行输入n个整数a1, a2, … an 。

2 ≤ n ≤ 50000, 0 ≤ ai ≤ 109,保证ai互不相同。数字间两两有空格隔开。

输出n个整数,相邻两个数之间用空格隔开。其中第i个数表示从集合A中删除ai,剩下n-1 个数构成的新集合的mex值 。

样例

4
5 0 3 1

2 0 2 1

使用一个set维护未出现过的非负整数即可

#include"bits/stdc++.h"
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> v(n);
    set<int> s;
    
    for(int i = 0;i < 1e5+5;i++){
        s.insert(i);
    }
    for(int i = 0;i < n;i++){
        cin >> v[i];
        s.erase(v[i]);
    }
    for(int i = 0;i < n;i++){
        s.insert(v[i]);
        cout << *s.begin() << " ";
        s.erase(v[i]);
    }
    return 0;
}

第三题

给定一棵有n个节点的树,节点用1,2, …, n编号。1号节点为树的根节点,每个节点上有一个用大写字母表示的标记。求每个节点的子树中出现的字母标记种类数。

注:子树的定义:设T是有根树,a是T中的一个顶点,由a以及a的所有后裔(后代)导出的子图称为有根树T的子树。

第一行输入一个正整数n, 表示树的节点数量。

第二行输入n-1个正整数,第i个整数表示第i+1号节点的父亲节点。

第三行输入长度为n的由大写字母组成的字符串s1s2…sn,第i个字符si表示第i号节点的标记。

3 ≤ n ≤ 50000。

数据保证形成一棵合法的树,字符串由大写字母组成。

输出n个整数,相邻两个数之间用空格隔开,第i个整数表示第i号节点的子树中出现不同的字母种类数。

样例

6
1 2 2 1 4
ABCCAD

4 3 1 2 1 1

dfs遍历的同时,维护一个哈希表存储不同字符的个数

#include"bits/stdc++.h"
using namespace std;
unordered_map<char,int> cnt;
int n;
string s;
vector<vector<int>> edge;
int ans[50005];
unordered_map<char,int> dfs(int cur){
    unordered_map<char,int> cnt;
    for(auto e : edge[cur]){
        auto res = dfs(e);
        for(auto p : res){
            cnt[p.first] +=p.second;
        }
    }
    cnt[s[cur - 1]]++;
    ans[cur] = cnt.size();
    return cnt;
}
int main(){
    cin >> n;
    edge.resize(n + 1);
    for(int i = 1;i < n;i++){
        int t;
        cin >> t;
        edge[t].push_back(i + 1);
    }
    cin >> s;
    dfs(1);
    for(int i = 1;i <= n;i++){
        cout << ans[i] << " "; 
    }
    return 0;
}

第四题

有n个城市,城市从1到n进行编号。小美最初住在k号城市中。在接下来的m天里,小美每天会收到一个任务,

  • 她可以选择完成当天的任务或者放弃该任务。第i天的任务需要在ci号城市完成,如果她选择完成这个任务,
  • 若任务开始前她恰好在ci号城市,则会获得ai的收益;若她不在ci号城市,她会前往ci号城市,获得bi的收益。
  • 当天的任务她都会当天完成,任务完成后,她会留在该任务所在的ci号城市直到接受下一个任务。如果她选择放弃任务,
  • 她会停留原地,且不会获得收益。小美想知道,如果她合理地完成任务,最大能获得多少收益?
  • 第一行三个正整数n, m和k,表示城市数量,总天数, 初始所在城市。

第二行为m个整数c1, c2,… cm,其中ci表示第i天的任务所在地点为ci。

第三行为m个整数a1, a2,… am,其中ai表示完成第i天任务且地点不变的收益。

第四行为m个整数b1, b2,… bm,其中bi表示完成第i天的任务且地点改变的收益。

1 ≤ k, ci ≤ n ≤ 30000, 1 ≤ m ≤ 30000, 0 ≤ ai, bi ≤ 109。

输出一个整数,表示小美合理完成任务能得到的最大收益。

样例
3 5 1
2 1 2 3 2
9 6 2 1 7
1 3 0 5 2

13

这个题dp写了半天,发现不太对,没啥时间了直接暴力回溯过了一半

#include"bits/stdc++.h"
using namespace std;
vector<int> a;
vector<int> b;
vector<int> c;
int n,m,k;
int ans = 0;
void dfs(int cur, int i, int pos){
    if(i >= m){
        ans = max(ans, cur);
        return;
    }
    if(pos == c[i]){
        dfs(cur + a[i], i + 1, c[i]);
    }else{
        dfs(cur + b[i], i + 1, c[i]);
    }
    dfs(cur, i + 1, pos);

}
int main(){
    cin >> n >> m >> k;
    a.resize(m);
    b.resize(m);
    c.resize(m);
    for(int i = 0;i < m;i++){
        cin >> c[i];
    }
    for(int i = 0;i < m;i++){
        cin >> a[i];
    }
    for(int i = 0;i < m;i++){
        cin >> b[i];
    }
    
    dfs(0, 0, k);
    cout << ans << endl;
    return 0;
}

第五题

有三个题库A、B、C,每个题库均有n道题目,且题目都是从1到n进行编号。每个题目都有一个难度值,题库A中第i个题目的难度为ai,

  • 题库B中第i个题目的难度为bi,题库C中第i个题目的难度为ci。

小美准备组合出一套试题,试题共有三道题,第一题来自题库A,第二题来自题库B,第三题来自题库C。
试题要求题目难度递增,且梯度不能过大。具体地说,第二题的难度必须大于第一题的难度,但不能大于第一题难度的两倍;
第三题的难度必须大于第二题的难度,但不能大于第二题难度的两倍。小美想知道在满足上述要求下,有多少种不同的题目组合?
(三道题目中只要存在一道题目不同,则两个题目组合就视为不同)

第一行一个正整数n, 表示每个题库的题目数量。

第二行为n个正整数a1, a2,… an,其中ai表示题库A中第i个题目的难度值。

第三行为n个正整数b1, b2,… bn,其中bi表示题库B中第i个题目的难度值。

第四行为n个正整数c1, c2,… cn,其中ci表示题库C中第i个题目的难度值。

1 ≤ n ≤ 20000, 1 ≤ ai, bi, ci ≤ 109。

样例

3
2 7 2
1 5 3
4 6 3

4

害,也是试了半天多多少少有点问题,我的评价是不如无脑暴力82%

#include"bits/stdc++.h"
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<vector<int>> v1(n);
    vector<vector<int>> v2(n);
    vector<int> p1(n);
    vector<int> p2(n);
    vector<int> p3(n);

    for(int i = 0;i < n;i++){
        cin >> p1[i];
    }
    for(int i = 0;i < n;i++){
        cin >> p2[i];
    }
    for(int i = 0;i < n;i++){
        cin >> p3[i];
    }
    int ans = 0;
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            for(int k = 0;k < n;k++){
                if(p1[i] < p2[j] && p1[i] * 2 >= p2[j] && p2[j] < p3[k] && p2[j] * 2 >= p3[k]){
                    ans ++;
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值