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题目练习