zoukankan      html  css  js  c++  java
  • 2021天梯赛决赛补题

    L2-1 包装机 (25 分)

    题意:就是有有3个队列,输入哪个序号对应的队列就落下一个数进入栈里,如果栈满了就把栈先提取出来一个再落下,拿出来的序号是多少?

    题解:当时脑子乱了,如果栈满应该先拿出来再落下的,理解错了,就一直输出MAAT了,其实就是遍历,按要求使用stack就可以了。

    代码:

    #include<bits/stdc++.h>
    #include<stack>
    #include<vector>
    using namespace std;
    const int maxn=1e3+7;
    int n,m,q,smax;
    int w,e;
    stack<int>s1[maxn];
    stack<int>s2,s3;
    vector<int>v;
    int main(){
        cin>>n>>m>>smax;
        for(int i=1;i<=n;i++){
            string p;
            cin>>p;
            for(int j=p.size()-1;j>=0;j--){
                s1[i].push(p[j]);
            }
        }
        cin>>q;
        while(q!=-1){
            if(q==0){
                if(s2.empty()!=1){
                    e=s2.top();
                    s3.push(e);
                    s2.pop();
                }
            }
            else{
             if(s1[q].empty()!=1){
                w=s1[q].top();
                s2.push(w);
                s1[q].pop();    
               }
               if(s2.size()>smax){
                       s2.pop();
                       s3.push(s2.top());
                       s2.pop();
                       s2.push(w);
               }            
            }
            cin>>q;    
        }
        while(s3.empty()!=1){
            v.push_back(s3.top());
            s3.pop();
        }
        for(int i=v.size()-1;i>=0;i--){
            cout<<char(v[i]);
        }
        cout<<endl;
    }

    L2-2 病毒溯源 (25 分)

    题意:病毒会一直变异,问变异出的最长序列是多少,变异了哪些个体?

    题解:跟虎口脱险那题很像,用标记数组找出第一个变异病毒的序号,然后用dfs搜索最长序列就好,不过应该对每一个病毒都进行一次dfs然后就可以排序把变异长度最多的放到第一个,然后再开一次dfs遍历即可,就可以得到最长的序列了。

    代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    const int N = 10007;
    
    int n, m, dis[N],f[N],p;
    int maxn=-1;
    int a[N];
    int g=0;
    vector<int> v[N];
    bool cmp(int a, int b)
    {
        if(dis[a] == dis[b]) return a < b;
        return dis[a] > dis[b];
    }
    int dfs(int x)
    {
        if(dis[x]) return dis[x];
        if(!v[x].size()) return dis[x] = 1;
        int ret = 0;
        for(int i = 0;i < v[x].size(); ++ i) {
            ret = max(ret, dfs(v[x][i]) + 1);
        }
        return ret;
    }
    void cz(int p){        
           a[g]=p;
            g++;
            if(v[p].size()!=0){
            cz(v[p][0]);
        }        
    }
    int main()
    {
        scanf("%d", &n);
        for(int i = 0;i < n; ++ i) {
            scanf("%d", &m);
            for(int j = 0;j < m; ++ j) {
                int x;
                scanf("%d", &x);
                f[x]=1;
                v[i].push_back(x);
            }
        }
        
        for(int i = 0;i < n; ++ i) {
            if(f[i]==0){
                p=f[i];
            }
            dis[i] = dfs(i);
            maxn = max(maxn, dis[i]);
        }
        cout<<maxn<<endl;
        for(int i = 0;i < n; ++ i) {
            sort(v[i].begin(), v[i].end(), cmp);
        }
        for(int i = 0;i < n; ++ i) {
            if(maxn == dis[i]) {
                cz(i);
                break;
            }
        }
        for(int i=0;i<g;i++){
            if(i==0){
                cout<<a[i];
            } 
            else{
                cout<<" "<<a[i];
            }
        }
        cout<<endl;
    }

    L2-3 清点代码库 (25 分)

    题意:题意很简单,就是对一定数组的数进行去重,判断有多少个。

    题解:没拿到满分,超时了,想法是把这些数组中的数转成string型,然后用p一直加起来,最后采用map<string,int>求出个数,不过超时了。。

    代码:

    #include<bits/stdc++.h>
    #include<map>
    using namespace std;
    const int maxn=1e4+7;
    struct xx{
        int x;
        string r;
    } a[maxn];
    bool cmp(xx p,xx q){
        return p.x>q.x;
    }
    int g;
    int main() {
        map<string,int>mp;
        map<string,int>::iterator it;
        int n,m;
        string p;
        cin>>n>>m;
        for(int i=0; i<n; i++) {
            int a[m+10]= {0};
            for(int j=0; j<m; j++) {
                cin>>a[j];
            }
            p.clear();            
            for(int j=0; j<m; j++) {        
                stringstream w;
                string e;
                w<<a[j];
                w>>e;
                if(j==0){
                    p+=e;
                }
                else{
                    p+=" ";
                    p+=e;
                }
            }
            mp[p]++;
        }
        cout<<mp.size()<<endl;
        for(it=mp.begin();it!=mp.end();it++){
            a[g].r=(*it).first;
            a[g].x=(*it).second;
            g++;
        }
        sort(a,a+g,cmp);
        for(int i=0;i<g;i++){
            cout<<a[i].x<<" "<<a[i].r<<endl;
        }
    }

    L2-4 哲哲打游戏 (25 分)

    题意:就是根据序号的多少,使用存档,读档,操作,然后输出存档的位置和最终的位置

    题解:用vector数组就可以,然后遍历判断就好,比较简单

    代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    int main() {
        int n, m;
        std::ios::sync_with_stdio(false);
        cin >> n >> m;
        vector<int> a[n+1];
        for(int i = 1; i <= n; i++) {
            int k;
            cin >> k;
            a[i].push_back(-1);
            for(int j = 0; j < k; j++) {
                int t;
                cin >> t;
                a[i].push_back(t);
            }
        }
        int t = 1;
        int b[n+1] = {0};
        for(int i = 0; i < m; i++) {
            int x, y;
            cin >> x >> y;
            if(x == 0) {
                t = a[t][y];
            }
            else if(x == 1) {
                cout << t << endl;
                b[y] = t;
            }
            else if(x == 2) {      
                t = b[y];
            }
        }
        cout << t;
    }
  • 相关阅读:
    redhat,centos Linux常用命令LS之常用功能
    人生信用卡
    如何让Redhat Linux启动时进入字符终端模式(不进入XWindow)
    OpenJDK和JDK区别
    Linux rpm 命令参数使用详解[介绍和应用]
    linux 的vim命令详解
    centos6.4安装javajdk1.8
    samba服务器 实现Linux与windows 文件共享
    SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换
    linux学习之 Linux下的Eclipse安装
  • 原文地址:https://www.cnblogs.com/liyongqi/p/14732703.html
Copyright © 2011-2022 走看看