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;
}
原文地址:https://www.cnblogs.com/liyongqi/p/14732703.html