2021年团体程序设计天梯赛-总决赛!
L2-1 包装机
思路:模拟
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,Smax;
cin>>n>>m>>Smax;
vector<queue<char>> q(n);
string str;
for(int i=0;i<n;i++)
{
cin>>str;
for(int j=0;j<m;j++)
q[i].push(str[j]);
}
stack<char> stk;
int op;
while(cin>>op,op!=-1)
{
if(op==0)
{
if(stk.empty())continue;
else {
cout<<stk.top();
stk.pop();
}
continue;
}
if(q[op-1].empty())continue;
if(stk.size()==Smax)
{
cout<<stk.top();
stk.pop();
}
char ch=q[op-1].front();
q[op-1].pop();
stk.push(ch);
}
return 0;
}
L2-2 病毒溯源
思路:DFS
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
bool st[N];
int Smax=0;
vector<int> a[N];
vector<int> path,temp;
void dfs(int u,int Max)
{
if(Max>Smax)
{
Smax=Max;
temp=path;
}
for(int i=0;i<a[u].size();i++)
{
int next=a[u][i];
path.push_back(next);
dfs(next,Max+1);
path.pop_back();
}
}
int main()
{
int n;//病毒种类,病毒0~n-1编号
cin>>n;
for(int i=0;i<n;i++)
{
int k;//第i种病毒产生的变异数目
cin>>k;
for(int j=0;j<k;j++)
{
int next;
cin>>next;
st[next]=true;
a[i].push_back(next);
}
sort(a[i].begin(),a[i].end());
}
for(int i=0;i<n;i++)
{
path.clear();
if(st[i]==false)
{
path.push_back(i);
dfs(i,1);
}
}
cout<<Smax<<endl<<temp[0];
for(int i=1;i<temp.size();i++)
cout<<' '<<temp[i];
return 0;
}
L2-3 清点代码库
思路:
每一组数据放入vector,然后map存每一组数据出现的次数,再将map中的键值对转移到一个pair中,通过调用C++的sort对pair<vector<int>,int> 排序,这里自己写一个比较函数。首先优先按照各组数据出现的次数排序,如果出现的次数相等,遍历vector各元素,按照vector元素从前到后字典序小的排在前面。
代码:
#include<bits/stdc++.h>
using namespace std;
map<vector<int>,int> mp;
bool cmp(pair<vector<int>,int> x,pair<vector<int>,int> y)
{
if(x.second==y.second)
{
for(int i=0;i<(x.first).size();i++)
{
if((x.first)[i]==(y.first)[i])continue;
else{
return (x.first)[i]<=(y.first)[i];
}
}
return true;
}
return x.second>y.second;
}
int main()
{
int n,m;//n模块数,m测试数
cin>>n>>m;
for(int i=1;i<=n;i++)
{
vector<int> v;
int x;
for(int j=1;j<=m;j++)
{
cin>>x;
v.push_back(x);
}
mp[v]++;
}
vector<pair<vector<int>,int>> a(mp.begin(),mp.end());
sort(a.begin(),a.end(),cmp);
cout<<a.size()<<endl;
for(int i=0;i<a.size();i++)
{
cout<<a[i].second<<' '<<(a[i].first)[0];
for(int j=1;j<(a[i].first).size();j++)
cout<<' '<<(a[i].first)[j];
if(i!=a.size()-1)cout<<endl;
}
return 0;
}
L2-4 哲哲打游戏
思路:
首先把每一个操作可以到达的剧情点放到vector中,然后用map存放每个档位的剧情点。
接下来就模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
map<int,int> mp;//存放每个档位的剧情点
int main()
{
int n,m;
cin>>n>>m;
vector<int> a[n+1];
for(int i=1;i<=n;i++)
{
int k,x;
cin>>k;
a[i].push_back(k);
for(int j=0;j<k;j++)
{
cin>>x;
a[i].push_back(x);
}
}
int now=1;
bool flag=false;
while(m--)
{
int op,x;
cin>>op>>x;
if(op==1)
{
mp[x]=now;
if(flag)
cout<<endl;
cout<<now;
flag=true;
}
else if(op==2)
{
now=mp[x];
}
else
{
now=a[now][x];
}
}
if(flag)
cout<<endl;
cout<<now;
return 0;
}