2021-04-18-美团实习-机试题

题目一

1. 描述

输入描述
第一行一个正整数n,表示接下来有n条操作,(1<= n <= 10000)
接下来n行,每行是两种操作中的一种:
append x y: 其中x y是两个正整数,表示接收到新闻x的热度提升了y。(新闻编号x的范围是[1.1000],单次热度提升y的范围是[1,1000])
query:用户向你发来查询。

输出描述:
对于每条用户查向,输出最高的十条新闻,以空格分隔。不足十条时,有几条输出几条。没有新闻时,输i出null, 每条查询的输出占一行。

2. 代码

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>

using namespace std;

bool cmp(pair<int, int> a , pair<int,int> b)
{
    
    
    if(a.second> b.second){
    
      
        return true;  
    }  
    else if(a.second== b.second)  
    {
    
      
        if(a.first < b.first){
    
      
            return true;  
        }else{
    
      
            return false;  
        }  
    }else{
    
      
        return false;  
    }  
}

int main()
{
    
    
    int N = 0; 
    cin >> N;

    unordered_map<int, int> map_s;
    for(int i = 0; i < N; i++){
    
    
        string ss = "";
        cin >> ss;
        if(ss == "append"){
    
    
            int news = 0;
            int hot = 0;
            cin >> news >> hot;
            if(map_s.find(news) == map_s.end()){
    
    
                map_s[news] = hot;
            }else{
    
    
                map_s[news] += hot;
            }
        }else{
    
    
            if(map_s.size() == 0){
    
    
                cout << "null" << endl;
            }else{
    
    
                vector<pair<int,int> > vec;
                for(auto it = map_s.begin(); it != map_s.end(); it++)
                {
    
    
                    vec.push_back(pair<int,int>(it->first, it->second));
                }
                sort(vec.begin(), vec.end(), cmp);
                int len = vec.size();
                int nums = min(len, 10);
                for(int i = 0; i < nums; i++){
    
    
                    cout << vec[i].first << " ";
                }
                cout << endl;
            }
        }
    }
    return 0;
}

题目二

1. 描述

输入描述
第一行三个正整数n, m, k,其中n代表玩具兵团A的小队数量,m代表玩具兵团的小队数量,k代表战场要求的战斗力最低值。
接下来n行,银行两个正整数xy,表示玩具兵团A的其中支小队有X个战斗力为y的玩具兵。
接下来m行,银行两个正整数xy,表示玩具兵团B的其中一支小队有X个战斗力为y的玩具兵。
1 <= n, m <=1000, 1 <= k <= 1000, 1<= x, y <=1e9

输出描述
第一行两个正整数, 以空格分割,分别表示小美能派出的战斗力总和, 小团能派出的战斗力总和。
第二行一个字符A或者B表示获胜方是小美还是小团,若小要获胜则输出A,反之则B。

2. 代码

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>
	
using namespace std;

int main(){
    
    
    int m = 0;
    int t = 0;
    int k = 0;
    cin >> m >> t >> k;
    
    unsigned int A = 0;
    unsigned int B = 0;

    for(int i = 0; i < m; i++){
    
    
        unsigned int num;
        unsigned int val;
        cin >> num >> val;
        if(val >= k){
    
    
            A += num * val;
        }
    }

    for(int i = 0; i < t; i++){
    
    
        unsigned int num;
        unsigned int val;
        cin >> num >> val;
        if(val >= k){
    
    
            B += num * val;
        }
    }

    cout << A << " " << B << endl;
    if(A > B){
    
    
        cout << 'A' << endl;
    }else{
    
    
        cout << 'B' << endl;
    }
}

题目三

1. 描述

输入描述
第一行一个正整数N,表示小美的调度操作数量。
接下来有N行,每行表示一个调度操作。其格式为下列两种之一:
1 x y: x为一个正整数,y为一个字符串,表示在原列车序列的基础上增加一一个车厢x,该车厢从属于y系列。
2 x y : x和y均为字符串,表示替换x系列和y系列在原车厢序中的位置。保证替换操作合法,即替换x系列和y系列时,这两种系列一定存在于列车序列中。
表示车厢系列的字符串将仅由大写字母组成。长度不超过5个字符。

输出描述
一行,按照从前到后的顺序给出调度结束后的车厢序列。车厢序号以一个空格隔开

2. 代码

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>
	
using namespace std;

int main(){
    
    
    unordered_map<string, int> pos;
    unordered_map<string, vector<int> > train;

    int N = 0;
    cin >> N;

    int level = 0;
    for(int i = 0; i < N; i++){
    
    
        int flag = 0;
        cin >> flag;
        if(flag == 1){
    
    
            int num = 0;
            string group = "";
            cin >> num;
            cin >> group;
            train[group].push_back(num);
            if(train[group].size() == 1){
    
    
                pos[group] = level;
                level++;
            }
        }else if(flag == 2){
    
    
            string t1 = "";
            string t2 = "";
            cin >> t1;
            cin >> t2;
            int tmp = pos[t1];
            pos[t1] = pos[t2];
            pos[t2] = tmp;
        }
    }

    for(int i = 0; i < level; i++){
    
    
        for(auto it: pos){
    
    
            if(it.second == i){
    
    
                for(int j = 0; j < train[it.first].size(); j++){
    
    
                    cout << train[it.first][j] << " ";
                }
                break;
            }
        }
    }
}

题目四

1. 描述

输入描述
第一行三个正整数n和m和k,表示有n个节点编号从1到n,并将给出m个节点关系,根节点编号是k。
接下来有m行,每行三个正整数t和xy,表示t的左儿子节点是x,右儿子节点是y。保证可以用这m个关系构建出n个点且以k为根的树。
接下来给出一行n个正整数,以空格分隔,分别代表每个节点的临界值。

输出描述
一行 一个正整数表示不能冲浪到的节点数量。

2. 代码

牛客

扫描二维码关注公众号,回复: 13386325 查看本文章
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>

using namespace std;
struct Node{
    
    
    int val;
    Node* left;
    Node* right;
    Node(int _val):val(_val),left(nullptr),right(nullptr){
    
    };
};
int res=0;
void dfs(Node* root,int low,int high){
    
    
    if(!root) return;
    if(!root->left&&!root->right){
    
    
        ++res;
        return;
    }
    if(root->val>=high){
    
    
        ++res;
        dfs(root->left,low,high);
    }else if(root->val<low){
    
    
        ++res;
        dfs(root->right,low,high);
    }else{
    
    
        ++res;
        dfs(root->left,low,root->val);
        dfs(root->right,root->val,high);
    }
}
int main(){
    
    
    int n,m,k;
    cin>>n>>m>>k;
    vector<Node*> tree(n+1);
    for (int i = 1; i <=n; ++i) {
    
    
        tree[i]=new Node(0);
    }
    for (int i = 0; i <m; ++i) {
    
    
        int t,x,y;
        cin>>t>>x>>y;
        tree[t]->left=tree[x];
        tree[t]->right=tree[y];
    }
    for (int i = 1; i <=n; ++i) {
    
    
        int val;
        cin>>val;
        tree[i]->val=val;
    }
    dfs(tree[k],INT_MIN,INT_MAX);
    cout<<n-res<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_35632833/article/details/115861947
今日推荐