2019~2021近三年天梯赛L2题目练习

Posted 中二病没有蛀牙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019~2021近三年天梯赛L2题目练习相关的知识,希望对你有一定的参考价值。

2021

L1-06 吉老师的回归(字符串)

思路

这个题并无难点,纯粹是为了复习一下字符串的相关操作。

读入一行字符串:

getline(cin,str1); //对于string类读入,前面的输入是cin>>ss;的话,str会读取上一行的结束符。

char str2[30];
cin.getline(str2,30);//读入整行数据,它使用回车键输入的换行符来确定输入结尾。第一个参数用来存储输入行的数组名称,第二个参数len是要读取的字符数。
cin.get(str2, 30);//和上面的区别在于不会读入换行符

代码

#include <bits/stdc++.h>
using namespace std;

int main() 

    std::ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    string str,word;
    int cnt = 0;
    getline(cin,str);
    while(n--) 
        getline(cin,str);
        stringstream ss;
        ss << str;
        bool flag = true;
        while (ss >> word)
        
            if(word.find("qiandao")!= word.npos || word.find("easy")!= word.npos) 
                flag = false;
                break;
            
        
        if(cnt == m && flag) 
            cout<<str<<endl;
            return 0;
        
        if(flag) cnt++;
    
    cout<<"Wo AK le"<<endl;
    return 0;

L2-09 包装机(栈,模拟)

题目:https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652360

思路

注意审题:如果轨道已经空了,再按对应的按钮不会发生任何事;同样的,如果筐是空的,按 0 号按钮也不会发生任何事。

一个模拟题,考察stl的运用。

代码

#include <bits/stdc++.h>
using namespace std;
unordered_map<int, queue<char>> g;
stack<int> st;
vector<char> ans;

int main() 

    std::ios::sync_with_stdio(false);
    int n, m, s, t;
    string str;
    cin>>n>>m>>s;
    for(int i = 1; i <= n; i++) 
        cin>>str; 
        for(auto c:str)
            g[i].push(c);
    
    while(cin>>t && t != -1)
        if(t == 0 && st.size() != 0) 
            ans.push_back(st.top());
            st.pop();
        
        if(t == 0) continue;

        if(g[t].size() != 0) 
            char c = g[t].front();
            if(st.size() == s)  
                ans.push_back(st.top());
                st.pop();
            
            g[t].pop();
            st.push(c);
        
    
    for(auto v :ans)
        cout<<v;
    cout<<endl;
    return 0;

L2-10 病毒溯源(dfs,路径存储)

思路

搜索到叶子结点的时候vector可以直接比较大小

内存超限的问题搞了巨久,教训:不要在递归的时候传入vector

代码

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 10005;
vector<int> g[maxn];
int pre[maxn];
int len = 0;

vector<int> ans,road;

void dfs(int u) 
    for(auto v : g[u]) 
        road.push_back(v);
        dfs(v);
        road.pop_back();
    
    if(g[u].size() == 0) 
        if( road.size() > len) 
            len = road.size();
            ans = road;
        
        if(road.size() == len) 
            ans = min(ans,road);
    



int main() 

    std::ios::sync_with_stdio(false);
    ans.reserve(maxn);
    
    int n , k, u, head;
    cin>>n;
    for(int i= 0; i < n; i++) 
        pre[i] = -1;
    
    for(int i = 0; i< n; i++) 
        cin>>k;
        while(k--) 
            cin>>u;
            g[i].push_back(u);
            pre[u] = i;
        
    
    for(int i = 0; i < n; i++) 
        if(pre[i] == -1) 
            head = i;
            break;
        
    
    road.push_back(head);
    dfs(head);

    cout<<len<<endl;
    for(int i = 0;i< ans.size();i ++) 
        if(i == ans.size() - 1) cout<<ans[i]<<endl;
        else cout<<ans[i]<<" ";
    
    return 0;

L2-11清点代码库 (STL,模拟)

思路

简单模拟题,map统计个数,sort一下输出就ok

代码

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int, vector<int> > PIV ;
const int maxn = 10050;
map<vector<int>,int> mp; //模块的个数
vector<PIV> ans;

bool cmp(PIV a, PIV b) 
    if(a.first == b.first) 
        return a.second < b.second;
    
    return a.first > b.first;


int main() 

    std::ios::sync_with_stdio(false);
    int n,m,u;
    cin>>n>>m;
    for(int i = 0;i < n; i++ ) 
        vector<int> fu; // bug1,忘记清空
        for(int j = 0;j < m;j++) 
            cin>>u;
            fu.push_back(u);
        
        if(mp.find(fu) == mp.end())
            ans.push_back(0,fu);
            mp[fu] = 1;
         else mp[fu]++;  
    
 
    for(int i = 0;i <ans.size();i++) 
        ans[i].first = mp[ans[i].second] ;      
    sort(ans.begin(),ans.end(),cmp);
    
    cout<<ans.size()<<endl;;
    for(auto u : ans) 
        cout<<mp[u.second];
        for(auto v : u.second)
            cout<<" "<<v;
        cout<<endl;
    

    return 0;

L2-12 哲哲打游戏(模拟)

题目:https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652363

代码

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 100005;
vector<int> g[maxn];
int ma[maxn];

int main() 

    std::ios::sync_with_stdio(false);
    int n,m,k,op,j,u;
    cin>>n>>m;
    for(int i = 1;i <= n;i++) 
        cin>>k;
        for(int j = 0;j < k ;j++)  
            cin>>u;
            g[i].push_back(u);
        
    
    int now = 1;
    while(m--) 
        cin>>op>>j;
        if(op == 0)
            now = g[now][j - 1];
        else if(op == 1)
            ma[j] = now;
            cout<<now<<endl;
         else 
            now = ma[j];
        
    
    cout<<now<<endl;
    return 0;

2020

L2-09 简单计算器 (模拟,栈)

题目:https://pintia.cn/problem-sets/994805046380707840/problems/1336215880692482056

思路

按题意模拟即可,注意要判断栈里是否为空

代码

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 10005;
stack<int> s1;
stack<char> s2;

int main() 

    std::ios::sync_with_stdio(false);
    int n, a,b;
    char op;
    cin>>n;
    for(int i = 0; i < n; i++)
        cin>>a;
        s1.push(a);
    
    for(int i = 0;i < n - 1; i++)
        cin>>op;
        s2.push(op);
    
    while(!s1.empty() || !s2.empty()) 
        a = s1.top();
        s1.pop();
        if(!s1.empty()) 
            b = s1.top();
            s1.pop();
         else 
            cout<<a<<endl;
            break;
        
        op = s2.top();
        s2.pop();
        int c;
        if(op == '/' )
            if( a == 0) 
                printf("ERROR: %d/0", b);
                break;
            
            c = b/a;
        else if(op == '*') c = b * a;
        else if (op == '-') c = b - a;
        else c = b + a;
        s1.push(c);
    
    return 0;

L2-10 口罩发放(大模拟)

思路

恶心人的模拟题,注意审题!!!

合法记录的身份证号 必须是 18 位的数字

需要注意最后输出按顺序只能用数组/vector,因为哈希表映射的顺序是随机的,无法保证按顺序输出。

unordered_map和unordered_set,用迭代器输出的话,输出顺序应该是哈希表从前往后的顺序,也不可能是输入到容器中的元素的顺序。

只能拿到20分,找不到错在哪了orz

代码

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1005;
struct people 
    string name,id,time;
    int si,cnt;

    bool operator < (const people &p) const 
        if(time == p.time) 
            return cnt < p.cnt;
        
        return time < p.time;
     
;
vector<people> re;

unordered_map<string,int> lastD,vis;
unordered_map<string,people> mp;
vector<string> WarnP;

bool check(string id) 
    if(id.size() != 18) return false;
    for(auto v :id) 
        if(v < '0' || v > '9') return false; //注意题目必须是数字
    
    return true;


int main() 

    std::ios::sync_with_stdio(false);
    int d,p,t,s;
    char ch;
    cin>>d>>p;
    for(int i = 1; i<= d; i++) 
        cin>>t>>s;
        re.clear();
        people pe;
        for(int j = 0;j < t; j++) 
            cin>>pe.name>>pe.id>>pe.si>>pe.time;
            pe.cnt = j;
            if(!check(pe.id)) continue;
            
            re.push_back(pe);
            mp[pe.id] = pe;
            
            if(pe.si == 1 && vis[pe.id] == 0) 
                WarnP.push_back(pe.id);
                vis[pe.id] = 1;
            
        

        sort(re.begin(), re.end());
        for(auto now :re)
            if(lastD[now.id] != 0 && i < lastD[now.id] + p + 1 )
                continue;
            lastD[now.id] = i;
            cout<<now.name<<" "<<now.id<<endl;
            s--;
            if(s == 2019~2021近三年天梯赛L2题目练习

PTA团体程序设计天梯赛-练习集 L2题目总结(完)

团体程序设计天梯赛-练习集L2-009 抢红包(25分)

团体程序设计天梯赛-练习集L2-007 家庭房产

PTA2022年蓝桥杯及天梯赛赛前训练(C++练习)

2021团体程序设计天梯赛题解